Dan*_*nny 35 ruby if-statement
所以我在这里找到了这个问题,但我遇到输出问题以及如何用if语句处理它.这就是我所拥有的,但它总是说即使文件中不存在文字监视器也是如此
if File.readlines("testfile.txt").grep(/monitor/)
do something
end
Run Code Online (Sandbox Code Playgroud)
它应该是=="nil"吗?我对ruby很新,不知道输出会是什么.
the*_*Man 59
我会用:
if File.readlines("testfile.txt").grep(/monitor/).any?
Run Code Online (Sandbox Code Playgroud)
要么
if File.readlines("testfile.txt").any?{ |l| l['monitor'] }
Run Code Online (Sandbox Code Playgroud)
readlines
虽然使用可扩展性问题,但它将整个文件读入数组.相反,foreach
如果没有可伸缩性问题,使用将完成同样的事情:
if File.foreach("testfile.txt").grep(/monitor/).any?
Run Code Online (Sandbox Code Playgroud)
要么
if File.foreach("testfile.txt").any?{ |l| l['monitor'] }
Run Code Online (Sandbox Code Playgroud)
有关可伸缩性问题的更多信息,请参阅" 为什么"啜饮"文件不是一个好的做法? ".
Ed *_* S. 32
可枚举#grep不返回布尔值; 它返回一个数组(如何在不传递块的情况下访问匹配项?).
如果未找到匹配项,则返回空数组,并[]
求值为true
.您需要在if
语句中检查数组的大小,即:
if File.readlines("testfile.txt").grep(/monitor/).size > 0
# do something
end
Run Code Online (Sandbox Code Playgroud)
文档应该是您这样的问题的第一个资源.
Grep会给你一系列所有'监视器'.但是你不想要一个数组,你想要一个布尔值:这个文件中是否有'monitor'字符串?这个文件根据需要读取的文件很少:
if File.open('test.txt').lines.any?{|line| line.include?('monitor')}
p 'do something'
end
Run Code Online (Sandbox Code Playgroud)
readlines读取整个文件,行返回一个逐行执行的枚举器.