Ruby/Rails アプリで次の式を見たことがあります。
def method(a, b = nil, &c)
c ||= ->(v) { v }
最初の部分は理解できますが、->() { ... }
構文は理解できません。どういう意味ですか?
簡潔にするために、変数名は変更されています。検索してみましたが、英数字以外は明らかにSEOの悪夢です。
Ruby/Rails アプリで次の式を見たことがあります。
def method(a, b = nil, &c)
c ||= ->(v) { v }
最初の部分は理解できますが、->() { ... }
構文は理解できません。どういう意味ですか?
簡潔にするために、変数名は変更されています。検索してみましたが、英数字以外は明らかにSEOの悪夢です。
ラムダリテラルです。ブロック変数を の中に入れ()
、ボディを の中に入れ{}
ます。
->(x, y){x + y}
この例で->(v){v}
は、 は単一の引数を取り、v
それを返します。つまり、恒等関数です。ブロックが に渡されるとmethod
、それが に割り当てられc
ます。そうでない場合は、アイデンティティ関数がc
デフォルトとして割り当てられます。
これは、Ruby 1.9 で導入されたラムダリテラルです。
irb> l = ->(v) { v }
# => #<Proc:0x007f4acea30410@(irb):1 (lambda)>
irb> l.call(1)
# => 1
次のように書くのと同じです:
irb> l = lambda { |v| v }
# => #<Proc:0x00000001daf538@(irb):1 (lambda)>
投稿した例では、何も指定されていない場合にメソッドにデフォルトのブロックを提供するために使用されています。これを考慮してください。
def method(a, &c)
c ||= ->(v) { v }
c.call(a)
end
method(1)
# => 1
method(1) { |v| v * 2 }
# => 2