`
CharlesCui
  • 浏览: 427730 次
  • 性别: 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` 都是用来创建匿名函数或者代码块的两种方式,它们在很多方面都是相似的,但有两点重要的区别。这些差异主要体现在`return`关键字的行为以及参数检查的方式上。 首先,我们来...

    开源项目-jasonmoo-lambda_proc.zip

    Lambda Proc通过提供一套API和工具,使得在Lambda上下文中启动和管理这些伴随进程变得更加容易。这可能包括启动守护进程、监控进程状态、传递数据以及在进程间建立通信通道等。 以下是Lambda Proc的一些关键知识点...

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

    在Ruby中,尽管我们有丰富的数据类型和类,但通过巧妙使用Proc对象和Lambda表达式,理论上可以模拟出各种数据结构和运算。 通过以上的讨论和实践,我们可以理解如何在Ruby这种高级编程语言中实现Lambda演算的基本...

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

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

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

    理解Proc和`lambda`的区别以及如何使用它们是Ruby编程中的重要概念,这有助于编写更灵活和可维护的代码。Proc对象和闭包的特性使得我们能够在函数式编程中利用高阶函数,以及在处理回调、事件驱动编程等方面发挥重要...

    透视Ruby 1.9的Lambda函数

    在Ruby 1.9之前,创建Lambda函数的方式较为繁琐,如使用`Proc.new`或`lambda`。Lambda与Block相似,但有一些重要的区别,例如Lambda在处理参数数量不匹配时会抛出异常,而Block则会尝试适应。此外,Lambda对return...

    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平台上...

    Ruby语言开发教程与案例.zip

    3. **块、 Proc 和 Lambda**:Ruby支持块(block),这是一种在代码中定义可重复使用的匿名函数的方式,Proc和Lambda是块的两种表示形式,它们可以捕获上下文并作为对象传递。 4. **闭包**:Ruby的Proc和Lambda都是...

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

    在本案例中,"nci-seronet-proc-layers"是一个专门为Seronet项目定制的Lambda Layers存储库,旨在为Lambda函数提供特定的共享库和功能支持。 这个存储库的主要目标可能是为了优化和标准化Seronet项目中的Lambda函数...

    ruby trap 初学者使用

    理解它们的差异,如 Proc的`call`和Lambda的`[]`调用方式,以及对上下文(self)和返回行为的影响,能避免很多问题。 4. **对象和类**: - Ruby是纯面向对象的语言,一切皆为对象。了解如何创建自定义类,继承和...

    ruby开发答疑借鉴.pdf

    总的来说,Ruby的语法简洁且富有表现力,它的迭代器、代码块、DSL、动态性以及Proc和Lambda等特性,共同构成了Ruby独特且强大的编程模型。对于有其他编程语言背景的开发者来说,理解这些核心概念将有助于更好地理解...

    Ruby Developer Guide

    3. **块、 Proc 和 Lambda**:Ruby中的块、Proc和Lambda是函数式编程的重要概念,它们可以捕获上下文,作为参数传递,并且可以被赋值给变量。 4. **闭包和作用域**:理解闭包的概念,它是Ruby中块、Proc和Lambda的...

    ruby中文教程

    4. **块、 Proc 和 Lambda**:Ruby中的块是一段可传递的代码,Proc和Lambda是块的两种表示形式,它们都可以被赋值给变量,作为参数传递,或者作为返回值。 5. **闭包**:Proc和Lambda是闭包,它们能捕获定义时的...

    ruby-2.3.3tar.gz

    3. **Syntax for Proc and Lambda (Proc和Lambda的语法)**:引入了`->`箭头操作符,可以更简洁地定义Proc和Lambda,如`->(a, b) { a + b }`。 4. **Safe Navigation Operator (安全导航运算符)**:`&.`用于调用可能...

    Ruby v2.6.3 正式版

    3. **块、 proc 和 lambda**:Ruby支持块(blocks),这是一种内联定义的代码段,可以通过`do..end`或花括号`{}`来定义。Proc和Lambda是可存储的代码块,它们可以作为参数传递,返回值,或者用作其他函数。 4. **...

Global site tag (gtag.js) - Google Analytics