使用 ARGF 处理管道的两种方式之间的区别?
Difference between 2 ways working with pipes using ARGF?
使用 ARGF,我可以创建 Ruby 尊重管道的程序。假设,我要不断阅读新条目:
$ tail -f log/test.log | my_prog
我可以使用:
ARGF.each_line do |line|
...
end
另外,我找到了另一种方法:
while input = ARGF.gets
input.each_line do |line|
...
end
end
看起来,这两种变体做同样的事情还是它们之间有区别?如果是这样,它是什么?
提前致谢。
正如 Stefan 所说,您在第二种情况下犯了一个小错误。在您的案例中使用 "ARGF.gets" 方法的正确方法如下:
while input = ARGF.gets
# input here represents a line
end
如果你像上面那样重写第二个例子,你的行为不会有差异。
您可能会注意到 ARGF#gets
and ARGF#each_line
之间的实际差异在于语义:each_line
接受块或 returns 枚举器和 gets
returns 下一行,如果它可用。
另一种选择是使用 Kernel#gets
。请注意,在某些情况下,它的行为可能与 ARGF#gets
不同,尤其是当您更改分隔符时:
A separator of nil reads the entire contents, and a zero-length separator reads the input one paragraph at a time, where paragraphs are divided by two consecutive newlines.
但要不断从标准输入读取(然后打印),您可以按如下方式使用它:
print while gets
使用 ARGF,我可以创建 Ruby 尊重管道的程序。假设,我要不断阅读新条目:
$ tail -f log/test.log | my_prog
我可以使用:
ARGF.each_line do |line|
...
end
另外,我找到了另一种方法:
while input = ARGF.gets
input.each_line do |line|
...
end
end
看起来,这两种变体做同样的事情还是它们之间有区别?如果是这样,它是什么?
提前致谢。
正如 Stefan 所说,您在第二种情况下犯了一个小错误。在您的案例中使用 "ARGF.gets" 方法的正确方法如下:
while input = ARGF.gets
# input here represents a line
end
如果你像上面那样重写第二个例子,你的行为不会有差异。
您可能会注意到 ARGF#gets
and ARGF#each_line
之间的实际差异在于语义:each_line
接受块或 returns 枚举器和 gets
returns 下一行,如果它可用。
另一种选择是使用 Kernel#gets
。请注意,在某些情况下,它的行为可能与 ARGF#gets
不同,尤其是当您更改分隔符时:
A separator of nil reads the entire contents, and a zero-length separator reads the input one paragraph at a time, where paragraphs are divided by two consecutive newlines.
但要不断从标准输入读取(然后打印),您可以按如下方式使用它:
print while gets