65

重複の可能性:
配列のすべての要素を関数に渡すより短い方法

私はこれがうまくいくことを知っています:

def inc(a)
  a+1
end
[1,2,3].map{|a| inc a}

しかし、Python では次のように書くだけです。

map(inc, [1,2,3])

また

[inc(x) for x in [1,2,3])

Ruby でブロックを作成する手順をスキップできるかどうか疑問に思っていたので、次のようにしました。

[1,2,3].map inc
# => ArgumentError: wrong number of arguments (0 for 1)
# from (irb):19:in `inc'

これを行う方法についてアイデアを持っている人はいますか?

4

3 に答える 3

94

" Passing Methods like Blocks in Ruby " によると、次のようにメソッドをブロックとして渡すことができます。

p [1,2,3].map(&method(:inc))

正直なところ、それが自分のブロックを転がすよりもはるかに優れているかどうかはわかりません.

使用しているオブジェクトのクラスでメソッドが定義されている場合は、次のようにすることができます。

# Adding inc to the Integer class in order to relate to the original post.
class Integer
  def inc
    self + 1
  end
end

p [1,2,3].map(&:inc)

その場合、Ruby はシンボルをインスタンス メソッド名として解釈し、そのオブジェクトのメソッドを呼び出そうとします。


Python では関数名をファースト クラス オブジェクトとして渡すことができるが、Ruby ではできない理由は、Ruby では括弧なしで引数なしでメソッドを呼び出すことができるためです。Python の文法では、括弧が必要であるため、関数名を渡す場合と引数なしで関数を呼び出す場合のあいまいさが回避されます。

于 2012-12-19T04:38:28.340 に答える
11

あなたの質問には答えませんが、本当にすべての変数を増やしたいだけなら、Integer#next

4.next
#=> 5

[1,2,3].map(&:next)
#=> [2, 3, 4]
于 2012-12-19T05:03:22.290 に答える
-15
def inc(a)
  a + 1 
end

p [1,2,3].map{|a| inc a}
于 2012-12-19T04:31:30.097 に答える