手続きオブジェクト

手続きオブジェクトとは

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

lambdaProcクラスのインスタンスを生成するメソッドです。

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

正当なCSSです!