Ruby спасает от отображения nil

Я новичок в 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

И как мне заставить его перестать отображать это на консоли? Я уверен, что это фундаментальная языковая вещь, просто очень новая для языка, поэтому мы будем очень благодарны за любое понимание.

Спасибо - Том


person user164266    schedule 03.10.2014    source источник
comment
Не могли бы вы подробнее рассказать, как запускать этот код? Вы копируете / вставляете его в консоль?   -  person BroiSatse    schedule 04.10.2014
comment
Привет, извините ... детали упущены. Я просто запускаю это в командной строке сервера Linux через сеанс SSH ... не через IRB или что-то еще.   -  person user164266    schedule 04.10.2014
comment
Все еще не может воспроизвести. Это полный код или просто фрагмент? nils никогда не отображаются в выводе, если вы не сообщите об этом (и вам действительно нужно видеть там nil, поскольку puts nil напечатает пустую строку)   -  person BroiSatse    schedule 04.10.2014
comment
BroiSatse ... Я придурок, извините :-( ... Я понял это. В реальном коде я печатал значение creation_date, не говоря, что "Файл в порядке" ... это был тот puts, который был печать nil, как и должно было быть! Извините ... первый день игры с этим языком. Большое спасибо за помощь и попытку продублировать проблему.   -  person user164266    schedule 04.10.2014
comment
(Не про ноль) Я думаю, вам нужно вставить оператор next после строки puts "skipping..., фактически пропуская недопустимый файл.   -  person steenslag    schedule 04.10.2014
comment
steenslag ... Вы правы, именно этим я и закончил. Спасибо!   -  person user164266    schedule 05.10.2014


Ответы (3)


Это ожидаемое поведение. Методы Ruby вернут последний вычисленный оператор, если return whatever не указан.

В приведенном вами примере вы заканчиваете оператором puts.

puts записывает ваш результат, затем возвращает nil, а затем ваш метод возвращает nil

В irb просто запустите следующие два оператора, чтобы увидеть это в действии.

puts 'foo'

'foo'

person bigtunacan    schedule 03.10.2014
comment
Однако в этом случае возвращаемое значение должно быть backup_dirs массивом, не так ли? - person BroiSatse; 04.10.2014

На самом деле это из-за #puts метод, который вы вызываете.

помещает (obj, ...) → ноль

Записывает указанные объекты в ios как с IO # print. Записывает разделитель записей (обычно символ новой строки) после любого, который еще не заканчивается последовательностью новой строки. При вызове с аргументом массива записывает каждый элемент с новой строки. Если вызывается без аргументов, выводит единственный разделитель записей.

$ stdout.puts ("this", "is", "a", "test") производит:

это проверка

Вы можете проверить это в pry / irb:

[9] pry(main)> puts "Hello"
Hello
=> nil
person Anthony    schedule 03.10.2014
comment
Спасибо. Я так понимаю, puts возвращает nil. И я знаю, что мы можем увидеть это при использовании irb. Однако почему puts в rescue показывает nil, а обычный - нет? (Это работает в стандартном сеансе SSH в Linux). И есть ли стандартный способ отключить nil, чтобы он не отображался? Спасибо еще раз за помощь. - person user164266; 04.10.2014
comment
Извините .. разобрался, ошибка моя, подробности написал в своем ответе! - person user164266; 04.10.2014

Все ... извините. Я понял это. В фактическом коде я делал puts creation_date, и это то, что заставляло nil отображаться ... как и должно быть!

Первый день изучения языка, ой! Тем не менее, узнал много о puts ... ценю все ответы, извините за зря потраченное время.

person user164266    schedule 03.10.2014