Proc类
Proc类就是能使块对象化的类
proc.new
hello = Proc.new do |name|
puts "hello, #{name}"
end
hello.call("wanglei")
以上代码结果为:
hello, wanglei
利用Proc.new方法,或者对proc方法制定快,都可以穿件代码块的Proc对象。
通过调用Proc.call方法执行块。
lambda
与Proc.new、proc一样,lambda也可以创建对象,但是通过lambda创建的Proc行为会更接近方法。
第一个不同点,lambda的参数数量的检查更加严密,对用Proc.new创建的Proc对象调用call方法时,call方法的参数数量与块变量的数量可以不同。但通过lambda创建Proc对象,如果参数数量不正确,程序就会产生错误。
prc1 = Proc.new do |a, b, c,|
p [a, b, c]
end
prc1.call(1, 2) #=>[1, 2, nil]
prc2 = lambda do |a, b, c|
p [a, b, c]
end
prc2.call(1, 2) #=>错误
第二个不同点,lambda可以使用return将值从块中返回。
通过Proc参数接收块
def total2(from, to, &block)
sum = 0
from.upto(to) do |i|
if block
sum += block.call(i)
else
sum += i
end
end
return sum
end
p total2(1, 10)
p total2(1, 10) {|i| i**2}
以上结果为:
55
385
Proc特征
虽然Proc对象可以作为匿名函数或方法使用,但它并不只是单纯的对象化。
def counter
c = 0
Proc.new do
c += 1
end
end
c1 = counter
p c1.call # 1
p c1.call # 2
p c1.call # 3
c2 = counter
p c2.call # 1
p c2.call # 2
p c1.call # 4
Proc类的实例方法
prc.call()
prc[]
prc.yield()
prc.()
prc === arg
上述方法都执行Proc对象prc