0

我是 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。我“用谷歌搜索”,发现puts返回nil. 但是为什么只显示在rescue区域而不显示File is okay.在行中。

即一个示例rescue输出将是:

Skipping /backups/log/fs.server.dir.999999999999.14.log, invalid file.
nil

而且,如何让它停止向控制台显示?我确信这是一个基本的语言事物,对语言来说非常新,所以任何见解都会非常感激。

谢谢 - 汤姆

4

3 回答 3

1

所有……对不起。我想通了。在实际的代码中,我正在做一个puts creation_date,这就是导致nil显示的原因......因为它非常应该!

第一天学习语言,哎呀!不过确实学到了很多puts……感谢所有的答案,很抱歉浪费大家的时间。

于 2014-10-03T20:58:15.973 回答
0

这实际上是因为您调用的#puts方法。

puts(obj, ...) → 无

与 IO#print 一样将给定对象写入 ios。在尚未以换行序列结尾的任何内容之后写入记录分隔符(通常是换行符)。如果使用数组参数调用,则将每个元素写入新行。如果不带参数调用,则输出单个记录分隔符。

$stdout.puts("this", "is", "a", "test") 产生:

这是一个测验

您可以在 pry/irb 中检查:

[9] pry(main)> puts "Hello"
Hello
=> nil
于 2014-10-03T20:26:15.793 回答
0

这是预期的行为。return whatever如果未指定,Ruby 方法将返回评估的最后一条语句。

在您提供的示例中,您以puts声明结尾。

puts写入您的输出然后返回nil,随后您的方法返回nil

从 irb 只需运行以下两个语句即可查看此操作。

puts 'foo'

'foo'

于 2014-10-03T20:23:43.360 回答