Ruby1.9 lambdaの書き方メモ

普通のlambdaの書き方

la = lambda {|x, y|
  return x * y
}
puts la.(2, 1)
=> 2


かっこをdoにした場合

la = lambda do |x, y|
  return x * y
end
puts la.(2, 2)
=> 4


Ruby1.9からは 「lambda」の代わりに「->」を使えるようになったらしす。ただ、lambdaをそのまま->に変えるだけじゃなくて、パラメータの位置がかっこ({)の前に来る。

la = ->(x, y) {
  return x * y
}
puts la.(2, 3)
=> 6


呼び出すには次の書き方もできる。

puts la[2, 4]
=> 8


かっこの代わりにdoを使った場合

la = ->(x, y) do
  return x * y
end
puts la[2, 5]


「->」とパラメータの「(」の間にスペースがあるとエラーになる。以下はエラー

la = -> (x, y) do
  return x * y
end
puts la[2, 6]
lambda.rb:23: syntax error, unexpected tLPAREN_ARG, expecting keyword_do_LAMBDA or tLAMBEG
la = -> (x, y) do 
         ^


以下いろいろ試してみたメモ

# 配列dataの中からlaで渡した条件にマッチしたものだけ返す
def filter(data, la)
  f = []
  data.each do |d|
    f.push d if la.call d
  end
  f
end

data = [1, 5, 2, 6, 3, 7, 4, 8]
f = filter data, ->(x) {
  x > 5
}
p f
=>[6, 7, 8]

f = filter data, ->(x) do
  x > 5
end
p f
=>[6, 7, 8]

# いっぱいらむだを渡してみた
def test(la1, la2, la3)
  p la1.call 'la1'
  p la2.call 'la2'
  p la3.call 'la3'
end

test ->(x) {"hello #{x}"},
  ->(x) {"hello #{x}"},
  ->(x) {"hello #{x}"}
=>"hello la1"
"hello la2"
"hello la3"