您的位置:首页 > 编程语言 > Ruby

Ruby Proc类

2015-10-16 15:51 405 查看

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

395

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: