ruby - 使用 while 循环从 Ruby 中的文件中读取

标签 ruby file-io while-loop

我发现当您想在 Ruby 中逐行读取文件时经常使用以下代码:

while (line = fileobject.gets)
  # code block such as 'puts line' or something
end

我只是需要一些帮助来了解那里发生了什么。我知道'while'后面是一个 bool 表达式,然后代码块将重复直到表达式返回'false'。

所以在这里, bool 表达式是 line = fileobject.gets...但是如何评估它是真还是假?对我来说,它看起来像是一个赋值语句,也就是说,您将“行”指定为文件对象的下一行。

我知道这将适用于逐行读取文本文件,但在我知道它为什么有效之前我不太愿意使用它。也许我只是太习惯了 C++ 的计数器和递增。 谢谢!

最佳答案

帮助您理解这一点的第一个原则是,在 Ruby 中,条件不只是 true 或 false,它们可以是任何值。然后该值被认为是“真实的”或“虚假的” - 即 - 就像是真实的一样是假的。在 Ruby 中,只有两个值是假的(表现得像假的):false itself and nil .

例如:

if nil  # nil is 'falsey'
  # Won't go here!
else
  # Will go here!
end

if 'randomstring'   # any string is 'truthy'
  # will go here!
end  

这个想法同样适用于 while 循环。

接下来是 gets method.如果查看文档,您会看到 IO::gets 方法在到达文件末尾时返回 nil。因此,当发生这种情况时,line 被设置为 nil,这是一个 fasley 值,然后循环退出。


简短版本:nil 类似于 false 并且 gets 在到达文件末尾时返回 nil .

关于ruby - 使用 while 循环从 Ruby 中的文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298263/

相关文章:

将字母 append 到文件末尾的 C 程序

android - 如何打破 Kivy 中的 while 循环?

ruby-on-rails - 如何从我的应用程序数据库中正确排序日期

ruby-on-rails - Ruby on Rails 中的堆栈级别太深错误

c++ - 在 C++ 中读取和写入同一个二进制文件

python - 如何使用 Python 从 24 位和小端字节序的文件中读取整数?

java - 如果在 while 循环内,则无法跳出 while 循环

ruby-on-rails - Rails Migration Change vs Up & Down 方法

ruby-on-rails - 如何在 rails 中使用 like 子句查询?

java - 内存映射文件会比 BufferedStream 更快吗?