3

具体的には、inject を使用して、次のスクリプト、

  • puts (1..5).inject {|x, y| x * y}
  • puts (1..5).inject(:*)

どちらも120期待どおりの出力を持っています。

ただし、スクリプト

print [[1,2], [3,4], [5,6]].map {|x, y| x * y}

出力あり

[2, 12, 30]

予想どおりですが、スクリプト

print [[1,2], [3,4], [5,6]].map(:*)

を発生させますArgumentError:

confused_ruby_map_inject.rb:1:in `map': wrong number of arguments(1 for 0) (ArgumentError)
    from confused_ruby_map_inject.rb:1:in `<main>'

:*2 番目のスクリプト セットで探している結果を達成するための最も簡潔な方法は何ですか?

4

3 に答える 3

2

inject特別な構文があります。アンパサンドを使用してマップに近づくことができます:

print [[1,2], [3,4], [5,6]].map(&:first) #=>[1, 3, 5] #note the ampersand

print [[1,2], [3,4], [5,6]].map(&:*)     #=>in `*': wrong number of arguments(0 for 1) (ArgumentError)

このエラーは、*メソッドがオプションではない引数 (文字列または整数) を受け取るためです。実行時に表示されるエラー[1,2].*です。

何をするかのデモ*:

p [1,2]*2       #=> [1, 2, 1, 2]
p [1,2]*' and ' #=> "1 and 2"
于 2013-02-20T21:58:48.420 に答える
2

次の方法で実行できます。

[[1,2], [3,4], [5,6]].collect{|t| t.inject(:*)}

ここで、注入がどのように機能するかを見ることができます Enumerable Doc's

よろしく、

于 2013-02-20T21:26:37.207 に答える