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
  • 相关阅读:
    MFiX做增量编译的时候不要删掉*.mod和*.inc文件
    Paraview教程
    origin生成直方图
    DEM轨迹后处理
    Zotero导入Markdown here插件
    origin把点图和线图放在一起
    mfix中输出DEM颗粒的固相速度到网格
    一个好用的ssh终端:MobaXterm
    GDB:从单线程调试到多线程调试(MFiX单步调试)
    操作系统概论-06
  • 原文地址:https://www.cnblogs.com/iaisoft/p/5955318.html
Copyright © 2011-2022 走看看