ruby 2.0,为啥#each_line 变异文件对象

Posted

技术标签:

【中文标题】ruby 2.0,为啥#each_line 变异文件对象【英文标题】:ruby 2.0, why is #each_line mutating File objectruby 2.0,为什么#each_line 变异文件对象 【发布时间】:2013-04-05 11:45:57 【问题描述】:

我将 irb 作为一次性文本预处理工具运行。我在打印文本时遇到了直接的麻烦。

foo = File.open "bar"
foo.each_line |l| puts l

这会按预期打印并返回#<File:emails plaintext>

但是,如果我在同一个对象上再次调用 #each_line,则不会发生打印,尽管它仍然返回 #<File:emails plaintext>

为什么File 对象的内容会被#each_line 的调用覆盖?我认为#each-like 方法的存在理由是确保不会发生突变。什么是正确的“红宝石方式”?

【问题讨论】:

each 方法与突变无关。这些概念是正交的。 但是,我只在 irb 中输入了 3 行,并且发生了这种情况,因此我感到困惑。我的理由是,除非您明确命令在传递给每个块的范围内发生突变,否则不会发生任何更改,#puts-like 方法也不应该改变状态。 文件是一个 I/O 对象。它有一个当前位置的概念。你把文件读到最后。没有更多内容可返回。 哦,好吧,我对文件流了解不够 如果您以这种方式打开文件,请不要忘记关闭它(foo.close)。 【参考方案1】:

你必须rewind it:foo.rewind

考虑$stdin.each_line 应该如何表现。由于 IO 对象可能是磁盘上的文件,也可能是流或管道,因此保证您可以在其中随机搜索是没有意义的。如果要迭代多次,则将其加载到数组中。

【讨论】:

我很欣赏完成我需要的不同选项的额外介绍以及技术解释

以上是关于ruby 2.0,为啥#each_line 变异文件对象的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:CSV到XML(版本2)

ruby逐行遍历文件

ruby仿awk处理列

为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?

Python list 可以在迭代期间发生变异,但不能在 deque 中发生变异。为啥?

为啥这被算作变异状态?