Ruby Proc类

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值