2017-06-22 41 views
0

下面的代碼時:未定義方法相結合的字母陣列與減少

a = "h", "e", "l", "l", "o" 

r = a.reduce(){|a, e| 
    puts "a class: " + a.class.to_s; 
    a + e; 

    puts "a: " + a.to_s() 
    puts "e: " + e.to_s 
} 

產生以下輸出:

a class: String 
a: h 
e: e 
a class: NilClass 
undefined method `+' for nil:NilClass 
(repl):5:in `block in <main>' 
(repl):3:in `each' 
(repl):3:in `reduce' 
(repl):3:in `<main>' 

但是當我運行而不puts調用的代碼,它運行良好。有人可以提供關於這個問題的澄清?

+2

Ruby強烈鼓勵省略空的參數列表,所以'reduce {| a,e |'和'to_s'在這裏是正確的形式。同樣省略';',除非在嚴格必要的情況下,比如將多條語句放在一行上。 – tadman

+0

你是什麼意思的「運行良好」? – sawa

+1

@sawa,它可能意味着它''成功地將數組減少到一個字符串而不會引發異常。 – FriendFX

回答

4

如果你有一點點改變你的代碼(例如以下),問題是固定的:

a = "h", "e", "l", "l", "o" 

r = a.reduce{|a, e| 
    puts "a class: " + a.class.to_s 
    puts "a: " + a.to_s 
    puts "e: " + e.to_s 
    a + e 
} 

的原因是,該塊,你傳遞給reduce,即代碼{}內,評估到nil,因爲最後一條語句puts返回nil

使用上面的固定代碼,塊評估(「返回」)最後一條語句a + e的結果,這可能是您想要減少字符數組的原因。

+0

優秀!謝謝。 – Aluthren

+0

我建議編輯這個和實現@ tadman的評論 –

+0

@MarkThomas是的,我承認我很懶惰...現在修復它。 – FriendFX