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 变异文件对象的主要内容,如果未能解决你的问题,请参考以下文章
为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?