解释'得到'方法:没有任何用户输入打印字符串?

时间:2016-12-07 19:28:10

标签: ruby methods file-io user-input

我正在通过“学习Ruby Hard the Hard Way”练习,并对练习20中的语法有疑问

input_file = ARGV.first

def print_all(f)
 puts f.read
end

def rewind(f)
  f.seek(0)
end

def print_a_line(line_count, f)
  puts "#{line_count}, #{f.gets.chomp}"
end

current_file = open(input_file)

puts "First let's print the whole file:\n"

print_all(current_file)

puts "Now let's rewind, kind of like a tape."

rewind(current_file)

puts "Let's print three lines:"

current_line = 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

在" print_a_line"功能,论证" f"如果是字符串插值,则在此参数上调用gets.chomp方法。这是代码运行时控制台上显示的内容(使用示例文本文件为ARGV.first,有三行)

First let's print the whole file:
This is Line 1
This is Line 2
This is Line 3
Now let's rewind, kind of like a tape.
Let's print three lines:
1, This is Line 1
2, This is Line 2
3, This is Line 3

我的问题是:为什么我们在" f"上调用gets.chomp?参数? "在哪里?#34;用户输入来自哪里?为什么这样做,但只是使用" f"没有任何附加方法不打印文本文件中的行?谢谢!

3 个答案:

答案 0 :(得分:2)

gets实际上与用户输入无关。在这种情况下,也不会以“通常”形式使用:

puts "what's your answer?"
answer = gets.chomp

通常,它是IO对象上的一种方法,它读取一个字符串(“字符串”被定义为“从当前位置到(并包括)换行符的所有字符”)。

在您的示例中,它在File对象上被调用(因此,逐行读取打开文件中的内容)。 "naked" form从文件读取行,通过命令行参数传递,或者(如果没有传递文件)从standard input传递。请注意,标准输入不一定是从键盘读取的(这就是您所谓的“用户输入”)。输入数据可以piped到您的程序中。

  

但仅使用“f”而没有任何附加方法不会打印文本文件中的行

f是对文件对象的引用。它不代表任何有用的可打​​印内容。但您可以使用它来读取文件中的某些内容(f.gets)。

答案 1 :(得分:0)

文件中的每一行都以换行符("\n")结束,方法puts显示字符串和换行符,以便显示字符串和两个新行。 chomp方法将删除字符串末尾的新行,因此只显示一个换行符。

请参阅doc => https://ruby-doc.org/core-2.2.0/String.html#method-i-chomp

答案 2 :(得分:0)

您看到的gets没有用户输入。相反,它属于IO类并读取IO流的下一行。 你可以在Ruby doc中找到它 https://ruby-doc.org/core-2.3.0/IO.html#method-i-gets