Ruby将显示nil用于救援

时间:2014-10-03 20:20:47

标签: ruby null rescue puts

我是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

而且,如何让它停止向控制台显示?我确信这是一种基本的语言,对语言来说是非常新的,所以任何见解都会受到高度赞赏。

谢谢 - 汤姆

3 个答案:

答案 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的知识,但是...感谢所有答案,对不起浪费每个人的时间。