2017-06-22 4 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呼び出しなしでコードを実行すると、それが正常に動作しますが。誰かがこの問題について明確に説明することはできますか?

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に渡されるということである、評価されます。あなたは、問題が修正される(例えば、以下に)ほんの少しコードを変更した場合

+2

Rubyは空の引数リストを省略することを強く推奨していますので、 'reduce {| a、e |'と 'to_s 'はここで正しい形式です。同様に、複数の文を1行に入れるなど厳密に必要な場合を除いて、 ';'は省略されます。 – tadman

+0

「うまく走る」とはどういう意味ですか? – sawa

+1

@ sawa、おそらく例外を発生させることなく配列を文字列に ''減らす 'ことを意味します。 – FriendFX

答えて

4

最後の文putsnilを返すため、nilになります。

上記の固定コードを使用すると、ブロックは最後のステートメントa + eの結果を評価(返す)します。これはおそらく文字配列を縮小するものです。

+0

優秀!ありがとうございました。 – Aluthren

+0

これを編集して@ tadmanのコメントを実装することをお勧めします –

+0

@マークトーマスええ、私は怠け者だと認めます...今すぐ修正しました。 – FriendFX

関連する問題