手続きオブジェクト
手続きオブジェクトとは
Proc
クラスのインスタンスで、ブロックのオブジェクト。
Proc.new{ |x| x }
proc{ |x| x }
lambda{ |x| x }
-> x{ x }
使い方
例えば、こんなときに使えます。
x = Array.new(20){|i| i}
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
func = -> x{x**2 + 2*x + 1}
y = x.map &func
#=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]
lambda
lambda
はProc
クラスのインスタンスを生成するメソッドです。
Proc.new
で生成したインスタンスよりも厳格で、引数の数が違うとエラーが発生します。
func1 = proc{|x| x ** 2}
func1.call 2, 3 #=> 4
func2 = -> x{ x ** 2}
func2.call
# ArgumentError (wrong number of arguments (given 2, expected 1))
returnの挙動
proc
はブロック中のreturn
でメソッドを抜け、lambda
は手続きオブジェクトを抜ける。
手続きオブジェクトの種類 | return |
---|---|
proc |
メソッドを抜ける |
lambda |
手続きオブジェクトを抜ける |
def func1
proc{ return :func1}.call
return
end
def func2
-> { return :func2}.call
return
end
p func1 # :func1
p func2 # nil