`
CharlesCui
  • 浏览: 418858 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Proc和Lambda的区别

阅读更多
Proc和Lambda的区别在网上没找到能说明白的文字

写写我自己的理解吧以免得忘记了还要再想

D:\>qri Proc
------------------------------------------------------------ Class: Proc
     +Proc+ objects are blocks of code that have been bound to a set of
     local variables. Once bound, the code may be called in different
     contexts and still access those variables.


D:\>qri lambda
---------------------------------------------------------- Kernel#lambda
     proc   { |...| block }  => a_proc
     lambda { |...| block }  => a_proc
------------------------------------------------------------------------
     Equivalent to +Proc.new+, except the resulting Proc objects check
     the number of parameters passed when called.


Proc和lambd都相当于定义一个代码块,然后这个代码块可以在需要用到的时候通过call(x,y,*z)来唤醒,但是他们的区别在于Proc中的代码影响到当前调用它的方法,而lambd中的代码只会在自己的代码块中起作用,如下一个广为传播的例子能够解释,我这里引用一下.

def foo
 f = Proc.new { return "return from foo from inside proc" }
 puts f.call #call的时候已经执行了return,所以foo方法执行完毕
 return "return from foo"#不会执行到这一句
end


def bar
 f = lambda { return "return from lambda" ;puts "continue?"}
 puts f.call #return只在(lambda)f这个块中返回,它后面这句puts "continue?"不会执行到
 return "return from bar"#这句话还会执行到,因为lambda中的return并没有影响到bar方法
end


puts foo 

输出
return from foo from inside proc

puts bar

输出
return from lambda
return from bar
5
1
分享到:
评论
1 楼 dennis_zane 2008-03-20  
lambda如果传入的参数少或者多都会抛出ArgumentError吧,而Proc.new传入的参数少的话就默认为nil,多的话就略去

相关推荐

    Ruby中的block、proc、lambda区别总结

    在规则引擎中,Ruby 的闭包使用特别频繁,而且有 block,Proc和 lambda 等后几种形式的用法,很让人困惑。为了深入理解代码,再次认真学习了一下 Ruby 的闭包,特别是 block,proc 和 lambda 几种用法的异同,这次的...

    Ruby中proc和lambda的两个区别

    主要介绍了Ruby中proc和lambda的两个区别,本文讲解了在proc和lambda中,return关键字有不同含义、检查参数的方式不同两个重要区别,需要的朋友可以参考下

    开源项目-jasonmoo-lambda_proc.zip

    开源项目-jasonmoo-lambda_proc.zip,在go中运行aws lambda函数的伴随进程

    Ruby中使用Block、Proc、lambda实现闭包

    闭包(Closure),是指未绑定到任何对象的自由代码,闭包中的代码与任何对象和全局变量无关,只与执行此段代码的上下文相关。 今天我们简要的看一下ruby中的闭包实现。 Ruby中的闭包实现有:Block,Proc,Lambada。 ...

    Ruby程序设计语言 (涵盖Ruby 1.8和1.9)源代码

    《Ruby程序设计语言》是Ruby的权威指南,全面涵盖该语言的1.8版和1.9版。本书详尽但并不拘泥于语言规范,既适合首次接触Ruby的资深程序员,同样也适合... Method、proc、lambda和closure  类和模块  反射和元编程

    Ruby编程语言

    在对Ruby进行了简要的综述之后,《Ruby编程语言》详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。本书还包含对...

    Ruby编程语言pdf

    在对Ruby进行了简要的综述之后,本书详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。 本书还包含对Ruby平台上...

    named_proc:命名 procs 和 lambdas

    当使用大量 proc 时,命名它们可能会很方便。 它使以后更容易识别它们。 有关使用命名过程的示例,请参阅 gem! 安装 添加到 Gemfile: gem 'named_proc' 命名特效 一个命名的 proc 就像一个普通的 proc,但它有...

    arrows:用于函数式编程和箭头的 ruby​​ lambda proc 工具

    除了 Haskell 过于通用且几乎难以接近的地方,我尝试为日常 Ruby 编程构建一组实际有用的功能工具特征: *注意,请参阅 spec/arrows/proc_spec.rb 以了解如何使用此垃圾功能组合如果给定 x -> F -> y 和 y -> G -> ...

    nci-seronet-proc-layers:此存储库用于存储Seronet Lambda函数的Lambda Layers共享库

    nci-seronet-proc-layers

    详解Ruby中的代码块对象Proc

    inc = lambda {| x | x + 1 } inc.call(2) #=> 3 # 法三 inc = ->(x) { x + 1} inc.call(2) #=> 3 # 法四 inc = proc {|x| x + 1 } inc.call(2) #=> 3 除了上面的四种之外,还有一种通过&操作符的方式,将代码块与...

    ruby基础教程(第四版)第21章 Proc类1

    1.lambda的参数检查更加严密,如果参数数量不正确,lambda会产生错误 1. opt 可省略的变量 2. :req 必须的变量 3. :rest 以*a

    binance:用Ruby编写的Binance加密货币交换的API包装器

    币安 这是Binance交换REST和WebSocket API的非官方Ruby包装器。 注意 我们现在是1.0,并且有一些重大更改,主要是一些方法名称和键的大小写。 当我编写更好的文档时,请确保...将proc或lambda传递给事件处理程序 支持

    如何利用Ruby简单模拟Lambda演算详解

    最近在学习lambda演算的相关内容,由于资料不全,学习的过程很是痛苦,下面这篇文章主要给大家介绍了关于如何利用Ruby简单模拟Lambda演算的相关资料,需要的朋友可以参考借鉴,下面来随着小编一起学习学习吧。

    Ruby on Rails中Rack中间件的基础学习教程

    标准的rack程序是一个可以响应call的对象,可以是对象、Proc、lambda甚至是method,它接收env参数(环境对象),返回一个数组,数组包括: 状态(status),http响应状态码 可以是hash,为http的header信息 拥有...

    value-evt:一个Racket库,可让您将任何值转换为可同步事件

    价值评估将任意值包装到可同步事件中。 事件的同步结果是原始值,但有两个例外:... By default, syncing on a procedure syncs to the return value> (define proc (lambda () (+ 2 2)))> (sync (value-evt proc))4

    rawline:RawLine是100%Ruby库,能够提供ReadLine提供的某些功能,以及其他功能,例如将字符绑定到特定键或键序列的更直观的方法

    RawLine RawLine的创建是为了提供ReadLine库的100%Ruby替代品,它提供了一些最受欢迎的功能,例如: ...editor.completion_proc = lambda做| word | 如果单词['select','update','delete','deb

Global site tag (gtag.js) - Google Analytics