Search code examples
rubynullrescueputs

Ruby puts Displaying nil in rescue


I am brand new to Ruby and am coming from a Python background. To help learn the language, I'm porting an existing Python script so I can do a side by side comparison. Thus far, I have a small bit of code and am confused as to why 'nil' prints to the console. Code below:

#!/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

If the DateTime.strptime method throws an exception, rescue runs and puts prints out the string fine. Except, after it comes a nil. I "googled" and found that puts returns nil. But why does that show only in the rescue area and not in the File is okay. line.

I.e. an example rescue output would be:

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

And, how do I make it stop displaying that to the console? I'm sure this is a fundamental language thing, just very new to the language so any insight would be much appreciated.

Thanks - Tom


Solution

  • This is expected behavior. Ruby methods will return the last statement evaluated if return whatever is not specified.

    In the sample you have provided you are ending with a puts statement.

    puts writes your output then returns nil and subsequently your method returns nil

    From irb just run the following two statements to see this in action.

    puts 'foo'

    'foo'