2014-10-03 10 views
0

Я совершенно новый для Ruby, и я исхожу из фона Python. Чтобы помочь изучать язык, я переношу существующий сценарий Python, чтобы я мог сравнивать бок о бок. До сих пор у меня небольшой код, и я смущен тем, что «nil» печатает на консоли. Код ниже:Ruby puts Отображает нуль в спасении

#!/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. Я «googled» и обнаружил, что puts возвращает nil. Но почему это видно только в области rescue, а не в линии File is okay..

I.e. выход пример rescue будет:

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

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

Thanks - Tom

+1

Не могли бы вы дать более подробную информацию о том, как вы запускаете этот код? Вы копируете/вставляете его в консоль? – BroiSatse

+0

Привет извините ... не учтены подробности. Я просто запускаю это в командной строке сервера Linux через сеанс SSH ... не через IRB или что-то еще. – user164266

+0

Все еще не может воспроизвести. Это полный код, или это просто фрагмент? 'nil' никогда не появятся на выходе, если вы не скажете об этом (и вам действительно нужно увидеть нуль там, так как 'puts nil' будет печатать пустую строку) – BroiSatse

ответ

0

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

В предоставленном образце вы заканчиваете заявление puts.

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

От IRB просто запустить следующие два утверждения, чтобы увидеть это в действии.

puts 'foo'

'foo'

+0

Однако в этом случае возвращаемое значение должно быть массивом 'backup_dirs', не так ли? – BroiSatse

0

Это на самом деле из-за #puts метода вы звоните.

путы (объект, ...) → ноль

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

$ stdout.puts ("это", "есть", "а", "тест") производит:

это тест

Вы можете проверить, что в монтировку/IRB:

[9] pry(main)> puts "Hello" 
Hello 
=> nil 
+0

Спасибо. Я понимаю, что 'puts' возвращает' nil'. И я знаю, что мы можем видеть их при использовании 'ir b'. Однако почему 'puts' в' rescue' показывает 'nil', а обычный - нет? (Это выполняется в стандартном сеансе SSH на Linux-боксе). И существует ли стандартный способ заглушения «nil», поэтому он не отображается? Спасибо еще раз за помощь. – user164266

+0

Извините ... разобрался, моя ошибка написала подробности в моем ответе! – user164266

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^