2017-09-19 2 views
-2

最近、私はあなたがrubyのreduceメソッドでパラメータを入れた順番が結果に影響を与えていることに注目しました。Rubyでのreduceメソッドの別の作業メカニズム

a = ["1", "2", "3"] 
a.reduce {|val, con| val + con} 
a = ["123"] 

しかし

a.reduce {|val, con| con + val} 
a = ["321"] 

私はそれだけであなたに順序を与えるどのように重要だと思う| |ヴァル、コンこれは、conが後者の位置にある場合、すべてのステップの結果が常にconに格納されることを意味します。そして、これらの2つは同じ結果をもたらすはずです。しかし明らかにここにはない。

誰かがヒントを提供できますか?ありがとう。これらの2つのメソッドがRubyでどのように実装されているかについての説明は、大いに役立ちます。

+1

は、https://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-reduceでのString#+ ' – Ilya

+0

ドキュメント'読ん行動やソースコードの説明を含めてください。 –

+0

'String#+'は非可換であり、結果が変わることは本当に驚くことではありません。同じ理由から、「Hello」+「World」は「World」+「Hello」と同じではありません。 –

答えて

0

ブロックの最初のパラメータはメモであり、オブジェクトはソリューションを構築し、後者はコレクションの「現在のアイテム」です。したがって、最初の例では、メモの前の2番目の例で、メモの後に項目を連結しています。両方の方法は合法です。結局それはあなたがしなければならないことに依存します。

+1

意味があります。私は間違いなく、後者は結果が「崩壊する」ものだと思っていました。先端に感謝します。 –

+0

歓迎します;) – Ursus

1

各ステップを印刷して、何が起こっているかを確認します。

a = %w{1 2 3} 
a.reduce {|memo, obj| 
    puts "memo is #{memo} and obj is #{obj}" 
    puts "new memo is #{memo + obj}", "="*23 
    memo + obj 
} 

#memo is 1 and obj is 2 
#new memo is 12 
#======================= 
#memo is 12 and obj is 3 
#new memo is 123 
#======================= 

a.reduce {|memo, obj| 
    puts "memo is #{memo} and obj is #{obj}" 
    puts "new memo is #{obj + memo}", "="*23 
    obj + memo 
} 

#memo is 1 and obj is 2 
#new memo is 21 
#======================= 
#memo is 21 and obj is 3 
#new memo is 321 
#======================= 
関連する問題