使用 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