で次のコードの文字の配列を組み合わせる:未定義のメソッド減らす
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
呼び出しなしでコードを実行すると、それが正常に動作しますが。誰かがこの問題について明確に説明することはできますか?
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
に渡されるということである、評価されます。あなたは、問題が修正される(例えば、以下に)ほんの少しコードを変更した場合
Rubyは空の引数リストを省略することを強く推奨していますので、 'reduce {| a、e |'と 'to_s 'はここで正しい形式です。同様に、複数の文を1行に入れるなど厳密に必要な場合を除いて、 ';'は省略されます。 – tadman
「うまく走る」とはどういう意味ですか? – sawa
@ sawa、おそらく例外を発生させることなく配列を文字列に ''減らす 'ことを意味します。 – FriendFX