我正在通过“学习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"没有任何附加方法不打印文本文件中的行?谢谢!
答案 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