美文网首页
ruby中的Proc

ruby中的Proc

作者: kamionayuki | 来源:发表于2015-05-27 09:00 被阅读504次

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)。

相关文章

  • ruby中的Proc

    block可以认为是一个一次性的、无法保存的Proc。如果有两个地方要用到相同的block,就必须要重复两遍。而P...

  • Ruby中Proc,Lambda

    Ruby中的 Proc 和 Lambda 有些类似 high-order function。Proc 和 Lamb...

  • Proc 与 lambda

    本文截取一段 ruby doc 官网 Proc 的内容并翻译,试图更好的理解和总结 Proc(non-lambd...

  • [转]浅谈Ruby中的block, proc, lambda,

    本文主要介绍了ruby开发中的比较容易混淆的几个概念,并以简单示例的形式展现他们之间的区别,明白了这些区别之后,在...

  • Understanding instance exec in r

    Understanding instance exec in ruby 在procs中有上下文 定义proc时,需...

  • ruby 方法调用中的*和&

    在ruby方法定义、调用中,*可以把数组转化为参数,&可以把Proc或lambda转化为块,在开发中可以起到很好的...

  • ruby proc/lambda/method/block

    一:proc / lambda 1.让我们分别以proc和lambda两种方式来定义代码块 2.proc和lamb...

  • Ruby block | lambda | Proc | yie

    据说每个面试ruby的公司都会问这个问题。 block 依旧是从代码直接开始 上面两个用的是Array的sort函...

  • Java8之函数接口

    以方法作为参数传递时,Ruby有proc,C#有Delegate,而JavaScript则更不用说,唯独Java在...

  • ruby Method proc lambda 和闭包

    Proc和Lambda的区别,主要是: Proc和Lambda都是对象,而Block不是 参数列表中最多只能有一个...

网友评论

      本文标题:ruby中的Proc

      本文链接:https://www.haomeiwen.com/subject/cjurqttx.html