Ruby File.open无法将nil转换为String(TypeError)

时间:2013-08-02 07:45:43

标签: ruby

我正试图从Zed Shaw的Learn Ruby the Hard Way练习15中运行此代码:

filename = ARGV.first

prompt = '> '
txt = File.open(filename)

puts "Here's your file: #{filename}"
puts txt.read()

puts "I'll also ask you to type it again:"
print prompt
file_again = STDIN.gets.chomp()

txt_again = File.open(file_again)

puts txt_again.read()

每次运行它时都会收到一条错误消息:

ex15.rb:4:in `initialize': can't convert nil into String (TypeError)
from ex15.rb:4:in `open'
from ex15.rb:4

发生了什么事?我无法使用此代码!

4 个答案:

答案 0 :(得分:0)

你是如何运行脚本的?看起来脚本需要一个参数,如:ruby my_script.rb file.txt

你提供这个论点吗?如果没有,ARGV[0]返回nil并且脚本在第4行失败,因为它评估为:

txt = File.open(nil)

File.open需要文件的文件名/路径,请参阅:File, Ruby 2.0 Docs

答案 1 :(得分:0)

查看错误消息:

Line 4: File.open waits for a String as an argument, and gets instead a Nil reference.

这意味着ARGV.first是脚本名称后命令行中的第一个参数,未定义。

答案 2 :(得分:0)

在这里:

filename = ARGV.first
# ...
txt = File.open(filename)

您假设filename,因此ARGV.first将始终存在。这是一个应该永远不会做出的假设,特别是在处理输入时。

如果没有给出,我建议您为filename提供默认值:

filename = (ARGV.count > 0) ?  ARGV.first : "default.txt"

或抛出自己的异常,让上层抽象来处理它:

raise RuntimeError.new "No input file" unless ARGV.count > 0

答案 3 :(得分:0)

我知道这个问题有点老了,但我认为答案可能会帮助其他人像我之前一样在同样的问题上寻求帮助。

有同样的问题,这就是我做的工作。

我的代码:

filename = ARGV.first
txt = open(filename)

puts "Here's your file #{filename}"
print txt.read

print "Type the filename again: "
file_again = $stdin.gets.chomp

txt_again = open(file_again)

print txt_again.read

这是正确的代码。但是在ex15.rb文件的代码中没有让文件工作并通过该错误的技巧。这是您在何处以及如何创建纯文本ex15_sample.txt文件。

如果您正在使用TextWrangler或类似TextMate,请创建另一个选项卡或窗口以及另一个文件。确保你选择纯文本:

enter image description here

然后在文件中写下给定的文本:

  

这是我输入文件的内容。   这真的很酷。   在这里有很多很多乐趣。

然后将其保存在与ex15.rb脚本相同的目录中。

然后去终点站。并键入以下内容(不是我使用的目录名称和路径是我的一个示例,您必须使用正确的信息填写它):

  

ruby​​ /users/ily​​afeynberg/desktop/rubyway/ex15.rb ex15_sample.txt

如果您正确执行了所有步骤,它应该正常运行并通过终端正确提示您。请注意,您必须提供ex15.rb文件的正确路径。如果我将它缩短并将我创建的导演遗漏并将其放入“rubyway”中,它就会失败。

注意:我老实说不清楚为什么,但是使用Mac上的TextEdit使用纯文本功能创建纯文本文件会给我带来一大堆问题并且无法正常工作。在我的编辑器中将其创建为纯文本文件并正确保存它会产生差异,让我了解我做错了什么以及我必须做些什么。所以我建议不要使用TextEdit,而是使用编写脚本的编辑器。

祝你好运!