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
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'