2014-10-03 44 views
0

我是Ruby的新手,來自Python背景。爲了幫助學習這門語言,我正在移植一個現有的Python腳本,以便我可以並排比較。到目前爲止,我有一些代碼,並且爲什麼'nil'打印到控制檯時感到困惑。下面的代碼:Ruby放在救援中顯示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.行顯示。

I.e.一個例子rescue輸出將是:

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

而且,我怎麼讓它停止顯示該控制檯?我確信這是一種基本的語言,對於這門語言來說只是非常新穎的東西,所以任何見解都會受到重視。

謝謝 - 湯姆

+1

你可以提供更多關於你如何運行這段代碼的細節?你複製/粘貼到控制檯? – BroiSatse 2014-10-03 20:30:23

+0

嗨,對不起...忽略了細節。我只是在Linux服務器的命令行上通過SSH會話來運行它......而不是通過IRB或任何東西。 – user164266 2014-10-03 20:37:26

+0

仍然無法重現。這是完整的代碼,還是隻是一個片段?除非你告訴它,否則'nil's不會出現在輸出中(並且你必須真的想在那裏看到零,因爲'puts nil'將會打印空行) – BroiSatse 2014-10-03 20:41:08

回答

0

這是預期的行爲。如果沒有指定return whatever,則Ruby方法將返回最後評估的語句。

在您提供的示例中,您以puts語句結尾。

puts寫那麼你的輸出返回nil,隨後你的方法返回nil

從IRB只要運行以下兩條語句,看到這個動作。

puts 'foo'

'foo'

+0

然而在這種情況下,返回值應該是'backup_dirs'數組,不是嗎? – BroiSatse 2014-10-03 20:25:56

0

這實際上是因爲#puts方法你打電話的。

看跌期權(OBJ,...)→零

將給定對象的ios與IO#打印。在任何尚未以換行符結束的記錄分隔符(通常爲 換行符)之後寫入記錄分隔符。如果使用數組參數調用 ,則將每個元素寫入新行。如果不帶參數調用 ,則輸出單個記錄分隔符。

$ stdout.puts( 「本」, 「是」, 「一」, 「測試」)生產:

這是一個測試

您可以檢查在撬/ IRB:

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

謝謝,我知道'puts'返回'nil',我知道在使用'ir時可以看到那些B'。然而,爲什麼''將'放在''rescue'顯示'nil'而普通的不是? (這是在Linux機器上的標準SSH會話中運行的)。而且,有沒有一種標準的方法來屏蔽'nil',使其不顯示?再次感謝您的幫助。 – user164266 2014-10-03 20:36:30

+0

對不起..算了一下,我的錯誤,在我的答案中寫下了細節! – user164266 2014-10-03 20:59:06

0

全部......對不起。我明白了這一點。在實際的代碼中,我做了一個puts creation_date,這就是導致nil顯示的原因......因爲它非常適合!

第一天學習語言,哎呀!雖然...瞭解了很多關於puts ...讚賞所有的答案,遺憾的是浪費每個人的時間。