使用写入打开文件抛出“没有将字符串隐式转换为整数”

Posted

技术标签:

【中文标题】使用写入打开文件抛出“没有将字符串隐式转换为整数”【英文标题】:Opening file with write throws "No implicit conversion of String into Integer" 【发布时间】:2022-01-19 00:28:16 【问题描述】:

自从我上次用 Ruby 编写代码已经有一段时间了(Ruby 2 是新的,哇,它已经是 3 了),所以我觉得自己像个白痴。

我有一个只包含单词的文本文件:

hello

我的 ruby​​ 文件包含以下代码:

content = File.read("test_file_str.txt","w")
puts content

当我运行它时,我得到:

`read': no implicit conversion of String into Integer (TypeError)

我以前从未发生过这种情况,但我已经有一段时间没有写代码了,很明显是 PEBKAC。

但是,当我在没有,"w" 的情况下运行它时,一切似乎都很好。我做错了什么?

ruby 3.0.3p157(2021-11-24 修订版 3fb7d2cadc)[x64-mingw32]

【问题讨论】:

【参考方案1】:

根据文档,File.read 的第二个参数是要从给定文件中读取的字节长度,它是一个整数。

打开文件,选择性地寻找给定的偏移量,然后返回长度字节(默认为文件的其余部分)。 read 确保文件在返回之前关闭。

因此,在您的情况下,发生错误是因为您传递了一个必须是整数的参数。它没有在 File.read 的文档中说明这一点,但它为 File#read 说明了这一点:

从 I/O 流中读取长度字节。

长度必须是非负整数或 nil。

如果要指定模式,可以使用mode 选项:

File.read("filename", mode: "r") # "r" or any other
# or
File.new("filename", mode: "r").read(1)

【讨论】:

【参考方案2】:

打开文件进行读取不接受写入模式

一般来说,在写入模式下打开文件句柄进行读取是没有意义的。因此,您需要将方法重构为:

content = File.read("test_file_str.txt")

或许:

content = File.new("test_file_str.txt", "r+").read

具体取决于您要执行的操作。

另请参阅:IO#new 中的文件权限

Ruby 3.0.3 中的文件文档将您指向IO#new 以获得可用的模式权限。如果您没有看到您正在寻找的确切选项,您可以查看那里。

【讨论】:

谢谢,添加 .read 对我来说并不直观。我不记得过去曾这样做过。我得读一读!非常感谢!

以上是关于使用写入打开文件抛出“没有将字符串隐式转换为整数”的主要内容,如果未能解决你的问题,请参考以下文章

文件处理

写入打开的 CSV 时跳过标题

用于打开、关闭、读取和写入文件到 TAPE 驱动器的 REXX 命令是啥?

Java:RandomAccessFile随机访问文件

java文件流stream,拷贝复制文件,读取文件,写入文件,及抛出异常的处理

12python文件的操作