我是Ruby的新手,我来自Python背景。为了帮助学习该语言,我移植了一个现有的Python脚本,以便我可以进行并排比较。到目前为止,我有一小部分代码,并对为什么“nil'打印到控制台。代码如下:
#!/usr/bin/ruby
require 'date'
backup_dirs = ['/backups/db', '/backups/log']
backup_dirs.each do |backup_dir|
Dir.glob(backup_dir + '/' + '*.*.*.*.*.*').each do |filename|
begin
creation_date = DateTime.strptime(filename.split('.')[3], '%m%d%Y%H%M')
rescue
puts "Skipping #{filename}, invalid file."
end
end
puts 'File is okay.'
end
如果DateTime.strptime
方法抛出异常,rescue
运行,puts
打印出字符串罚款。在它出现nil
之后。我用谷歌搜索了#34;并发现puts
返回nil
。但为什么只显示在rescue
区域而不是File is okay.
行。
即。示例rescue
输出为:
Skipping /backups/log/fs.server.dir.999999999999.14.log, invalid file.
nil
而且,如何让它停止向控制台显示?我确信这是一种基本的语言,对语言来说是非常新的,所以任何见解都会受到高度赞赏。
谢谢 - 汤姆
答案 0 :(得分:0)
这是预期的行为。如果未指定return whatever
,Ruby方法将返回评估的最后一个语句。
在您提供的示例中,您将以puts
语句结束。
puts
写入您的输出然后返回nil
,然后您的方法返回nil
从irb中运行以下两个语句,看看这个是否正常。
puts 'foo'
'foo'
答案 1 :(得分:0)
这实际上是因为您正在调用的#puts方法。
puts(obj,...)→nil
将给定对象写入ios,与IO#print一样。写一个记录分隔符(通常是一个 在任何尚未以换行序列结束的任何内容之后。如果 使用数组参数调用,将每个元素写入新行。如果 不带参数调用,输出一个记录分隔符。
$ stdout.puts("这",""," a"," test")产生:
这是一个测试
您可以在pry / irb中检查:
[9] pry(main)> puts "Hello"
Hello
=> nil
答案 2 :(得分:0)
全部......抱歉。我想通了。在实际的代码中,我正在执行puts creation_date
,这就是导致nil
显示的原因......因为它非常好!
第一天学习语言,哎呀!我已经学到了很多关于puts
的知识,但是...感谢所有答案,对不起浪费每个人的时间。