`
lfx_cool
  • 浏览: 67600 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

proc and lambda

阅读更多
A return from inside a block that’s still in scope acts as a return from that scope. A return
from a block whose original context is not longer valid raises an exception (LocalJumpError
or ThreadError depending on the context). The following example illustrates the first case:
引用
def meth1
  (1..10).each do |val|
    return val # returns from meth1
  end
end
meth1 # => 1

This example shows a return failing because the context of its block no longer exists:
def meth2(&b) 
  b 
end 
res = meth2 { return } 
res.call 
produces: 
prog.rb:5:in `block in <main>': unexpected return (LocalJumpError) 
from /tmp/prog.rb:6:in `call' 
from /tmp/prog.rb:6:in `<main>' 

And here’s a return failing because the block is created in one thread and called in another:
def meth3 
  yield 
end 
t = Thread.new do 
  meth3 { return } 
end 
t.join 
produces: 
prog.rb:6:in `block (2 levels) in <main>': unexpected return (LocalJumpError) 
from /tmp/prog.rb:2:in `meth3' 
from /tmp/prog.rb:6:in `block in <main>' 

The situation with Proc objects is slightly more complicated. If you use Proc.new to create
a proc from a block, that proc acts like a block, and the previous rules apply:
def meth4 
p = Proc.new { return 99 } 
p.call 
puts "Never get here" 
end 
meth4 # => 99 

If the Proc object is created using Kernel.lambda, it behaves more like a free-standing
method body: a return simply returns from the block to the caller of the block:
def meth5 
p = lambda { return 99 } 
res = p.call 
"The block returned #{res}" 
end 
meth5 # => "The block returned 99" 

Because of this, if you use Module#define_method, you’ll probably want to pass it a proc
created using lambda, not Proc.new, because return will work as expected in the former and
will generate a LocalJumpError in the latter.

1.8中Proc.new和lambda的行为是一样的,但在1.9中Proc.new发生改变,所以在新代码尽量不要使用Proc.new,除非你确信你的代码不会运行在1.8的环境中
分享到:
评论

相关推荐

    ruby-2.3.3tar.gz

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

    linux版 ruby-2.3.0

    - **Improved Proc and lambda**:Proc对象的行为更接近lambda,特别是在处理块的返回值时。 - **Performance enhancements**:对垃圾回收机制进行了优化,提升了整体运行效率。 Ruby-2.3.0还在错误处理、字符串...

    ruby 2.0.0 p353稳定版本

    - ** Proc and Lambda**:Proc 对象现在可以被转换为 Lambda,这使得块的行为更一致,尤其是在处理迭代器时。 2. **Windows 安装**: - `rubyinstaller-2.0.0-p353.exe` 是专为 Windows 用户设计的安装程序,包含...

    Programming Ruby (English Version) and Source Code

    3. **块、Proc和Lambda**:Ruby中的代码块是一种特殊的语法结构,可以与 Proc 和 Lambda 对象关联,用于创建可重用的代码片段。 4. **模块(Module)**:Ruby的模块用于实现命名空间、混合(Mix-in)功能,以及提供...

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

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

    Pro.C#.5.0.and.the..NET.4.5.Framework,.Andrew.Troelsen

    根据提供的文件信息,本书《Pro C# 5.0 and the .NET 4.5 Framework》由Andrew Troelsen编写,是一本面向中级到高级.NET开发者的专业书籍。本书旨在为读者提供C# 5.0及.NET 4.5框架的深入理解与实践指导。 ### 1. ...

    Pragmatic.rogramming.Ruby.1.9.and.2.0.4th.Edition.pdf

    3. **块、proc和lambda**:这些是Ruby中实现函数式编程的关键,用于定义可复用的代码片段,并可以在适当的地方传递。 4. **元编程**:Ruby允许在运行时修改自身,这是其强大之处。书中会介绍如何利用`class_eval`、...

    ruby for rails

    6. 可能还包括异常处理、函数式编程元素(如Proc和Lambda)、元编程(Metaprogramming)等高级话题,这些内容能够帮助开发者更好地理解和利用Ruby的灵活性。 通过学习《Ruby for Rails》,开发者不仅能掌握Ruby语言...

    ruby_learning

    5. ** Proc 和 Lambda**: `Proc`和`lambda`是可调用的对象,可以存储代码块。它们的区别在于对参数数量和返回语句的处理,`lambda`更接近于传统的函数行为。 6. **符号(Symbols)**: Ruby中的符号是不可变的字符串...

    学习技术100

    3. **块、 Proc 和 Lambda**:Ruby提供了处理代码块的能力,Proc和Lambda是可存储的代码块,可以作为参数传递和作为方法返回。 4. **元编程**:Ruby允许在运行时修改和创建类和方法,这使得编写自定义的代码生成和...

    comp:一个向函数和方法添加功能组成的Ruby库

    一个将添加到 (包括lambda )和Ruby库。 当前版本: 1.0.0 支持的Ruby版本: 1.9.2、1.9.3、2.0、2.1、2.2 安装 gem install comp -v '~&gt; 1.0' 或者,在您的Gemfile : gem 'comp' , '~&gt; 1.0' 用法 require '...

    Ruby学习思维导图.pdf

    **4.1 块、Proc 和 Lambda** - **块**:一段可以作为参数传递给方法的代码。 - **Proc 对象**:可调用的过程对象。 - **Lambda**:更严格的形式化过程对象。 **4.2 线程和并发** - **线程创建**:使用 `Thread....

    ruby metaprogramming examples

    使用`Proc`和`lambda`可以使块成为一等公民,并且可以存储和传递。 8. 代码块和调用约定(Hooks and Callbacks):在元编程中,经常需要在某些方法调用前后执行特定的代码。Ruby允许你定义`before`、`after`和`...

    association-dlc

    由于标签是 "Ruby",我们可以进一步推测项目可能深入到 Ruby 语言的一些特性,比如元编程、面向对象编程、块(blocks)、Proc 对象和 Lambda 函数等。Ruby 以其简洁、表达性强的语法而著名,使得代码更易于理解和...

    雄激素

    块可以转换为lambda或Proc对象,形成闭包,保留其定义时的上下文。 3. **Gem**:Ruby的包管理系统,允许开发者共享和安装第三方库,如Rails(一个流行的Web开发框架)、ActiveRecord(ORM,对象关系映射)等。 4. **...

Global site tag (gtag.js) - Google Analytics