1

我正在尝试从 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

4 回答 4

0

你是如何运行脚本的?脚本似乎需要一个参数,如下所示ruby my_script.rb file.txt

你提供了这个论据吗?如果不是,则ARGV[0]返回nil并且脚本在第 4 行失败,因为它的计算结果为:

txt = File.open(nil)

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

于 2013-08-02T07:54:49.487 回答
0

查看错误信息:

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

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

于 2013-08-02T07:55:03.550 回答
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
于 2013-08-02T12:29:15.370 回答
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,请创建另一个选项卡或窗口以及另一个文件。确保您选择纯文本:

在此处输入图像描述

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

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

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

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

红宝石/users/ily​​afeynberg/desktop/rubyway/ex15.rb ex15_sample.txt

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

注意:老实说,我不确定为什么,但是在 mac 上使用 TextEdit 的纯文本功能创建纯文本文件给我带来了很多问题并且没有用。在我的编辑器中将它创建为纯文本文件并正确保存它会有所不同,让我了解我做错了什么以及我必须做对什么。所以我建议不要使用 TextEdit,而是使用你编写脚本的编辑器。

祝你好运!

于 2014-07-20T17:40:21.710 回答