我无法将IO.read理解为ruby参数

时间:2017-01-15 18:46:30

标签: ruby io

我正在研究关于rubyquiz的madlib练习并遇到了一条我不明白的界限:

madlib = Madlib.new(IO.read(ARGV.shift))   

我已经完成了大量谷歌搜索,但没有发现任何有用的信息。 我不知道该怎么办。

madlib = Madlib.new(IO.read(ARGV.shift))
answers = []
madlib.list_questions do |i, q|
  print "Give me " + q + ": "
  answers[i] = gets.strip
end
answers.each_index {|i| madlib.answer_question(i, answers[i]) }
puts madlib.show_result

2 个答案:

答案 0 :(得分:3)

短版

它将指定为参数(ruby script.rb file.txt)的文件内容作为单个字符串发送给Madlib.new

更长的版本

ARGV.shift

madlib = Madlib.new(IO.read(ARGV.shift))

ARGV.shiftruby script.rb之后的第一个参数。对于:

ruby script.rb some_text_file.txt

some_text_file.txt

请注意,ARGV.shift也会从ARGV中删除第一个参数。下次调用ARGV.shift时,它将在ruby script.rb之后返回第二个参数。

IO.read()

IO.read('file.txt')读取file.txt的全部内容,并将其作为字符串返回。

由于File继承自IO,此处的示例读取文件,因此也可以写为File.read(filename)

Madlib.new()

IO.read返回的字符串会发送到Madlib.new

答案 1 :(得分:1)

确实非常简单。

IO.read用于读取名称在数组ARGV中的文件,该文件包含传递给此Ruby程序的参数。

序列是:

  1. 传递包含文件名的参数。此参数将在ARGV数组中;
  2. ARV.shift返回ARGV数组的第一个元素,即文件名;
  3. 然后IO.read接收此参数,该参数读取相应的文件并返回其内容;和,
  4. 最后,这些内容由Madlib.new接收,它会根据它们创建一个Madnew实例。
  5. 如您所见,传递给Madlib.new的真实参数是IO.read的结果,而不是IO.read本身的结果。