Ruby 学习笔记7

block可以认为是一个一次性的、无法保存的Proc。
如果有两个地方要用到相同的block,就必须要重复两遍。而Proc可以把block保存下来,只需要调用两次即可。
先来看看怎么调用Proc,与block有什么不同。

class Array
    def interate(code)
        self.each_with_index do |n,i|
            self[i] = code.call(n) * 10
        end
    end
end

array_1 = [1,3,5,7]
array_2 = [2,4,6,8]

myproc = Proc.new do |n|
    n**2
end

array_1.interate(myproc)
array_2.interate(myproc)
p array_1 #=>[10,90,250,490]
p array_2 #=>[40,160,360,640]
p myproc.class #=>Proc
由上可见,myproc就是一个Proc,当array_1和array_2想要计算时,直接调用myproc即可,不需要再写一遍block中的代码。
当然,在调用Proc上,与block有一点不同,block是用yield调用,而Proc是用call方法调用。并且Proc会需要参数,而block则不用。看一下两者不同的地方

class Array
    #block
    def iterate!
        self.each_with_index do |m,i|
            self[i] = yield(m)
        end
    end   

    #Proc
    def interate_1(code)
        self.each_with_index do |n,i|
            self[i] = code.call(n) * 10
        end
    end
end

#blcok
array = [1,2,3,4]
array.iterate! do |m|
    m **=2
end
p array

#Proc
array_1 = [1,2,3,4]
myproc = Proc.new do |n|
    n**2
end
array_1.interate_1(myproc)
p array_1
至于什么时候用block,什么时候用Proc。前人经验:
1、Block:方法把一个对象拆分成很多片段,并且你希望你的用户可以与这些片段做一些交互。
2、Block:希望自动运行多个语句,如数据库迁移(database migration)。
3、Proc:希望多次复用一段代码。
4、Proc:方法有一个或多个回调方法(callbacks)。

文/kamionayuki(简书作者)
原文链接:http://www.jianshu.com/p/4ad4517ed6a8
原文地址:https://www.cnblogs.com/iaisoft/p/5955318.html