Ruby Proc类

Proc类

Proc类就是能使块对象化的类

    1

proc.new

hello = Proc.new do |name|
    puts "hello, #{name}"
end

hello.call("wanglei")

    1
    2
    3
    4
    5

以上代码结果为:
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)     #=>错误

    1
    2
    3
    4
    5
    6
    7
    8
    9

第二个不同点,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}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

以上结果为:
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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

Proc类的实例方法

prc.call()
prc[]
prc.yield()
prc.()
prc === arg
上述方法都执行Proc对象prc
---------------------
作者:wlchn
来源:CSDN
原文:https://blog.csdn.net/wlchn/article/details/49179737
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-07-20 18:16  天涯海角路  阅读(139)  评论(0)    收藏  举报