2016-04-20 23 views
0

我將展示的是一個完整的函數,但它只是以簡單的方式解釋我的問題。如果我解決了這個功能的問題,我也解決了原始代碼中的問題。範圍打印在「每個」迭代結束時

問題很簡單,也可能是解決方案,但我是Ruby新手,並且有這個疑問。我想在一個範圍內打印值:

def test 
    (0...5).each do |i| 
    puts i 
    end 
end 

當我打電話的功能,我想是

0 
1 
2 
3 
4 

的結果,但結果我已經是

0 
1 
2 
3 
4 
0...5 

爲什麼這個0...5一起打印?我怎樣才能避免這種情況?

回答

4

我不認爲0..5正在生產作爲puts調用的一部分。相反,當你在你的REPL(irb,pry,rails console等)中調用它時,你會看到它,因爲它是代碼中最後返回的值。

讓我給你看一個例子。

說我救了一個名爲test.rb,內容如下文件:

1.upto(5).each { |i| puts i } 

如果我打電話ruby test.rb,我看到預期的輸出,

0 
1 
2 
3 
4 

如果我打開IRB和運行require("./test.rb"),我看到相同的輸出。

只有當我將代碼粘貼到irb中時,纔會看到額外的輸出(=> 0...5)。所以我會忽略這一點。

+0

我在這裏沒有相同的行爲。如果我只將我的循環保存在一個rb文件中,就像你所做的那樣,我已經得到了期望的輸出。但是如果我把它們放入一個函數中,範圍會再次打印。當我在我的linux終端中調用'ruby test.rb'時。 – rwehresmann

+0

我剛剛測試過。把'def foo; 1upto(5).each {| i |把我};結束; foo「,並用'ruby test.rb'調用它只是打印1到5的數字。我試圖做的主要觀點是在REPL(比如IRB)中,你會看到'puts/print'調用以及每個函數的返回值。 –

2

除了@Max's answer

每當任何表達在IRB會話中執行,它也將打印由執行每個表達式返回的值。

在方法定義的情況下,它返回剛剛定義的method_name

> def my_method 
?> puts 'this is my method' 
?> end 
=> :my_method 

你看,:my_method印刷

當調用該方法,應該打印由所述方法執行,即在該方法中的最後一個表達式的響應中返回的值即puts

> my_method 
this is my method 
=> nil 

但它印上nil,因爲putsalways returnsnil。我之所以提到這一點,是因爲通常開發人員在看到他們的方法意外返回nil時感到驚訝。