zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/iaisoft/p/5955318.html
Copyright © 2011-2022 走看看