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的环境中
分享到:
相关推荐
3. **Syntax for Proc and Lambda (Proc和Lambda的语法)**:引入了`->`箭头操作符,可以更简洁地定义Proc和Lambda,如`->(a, b) { a + b }`。 4. **Safe Navigation Operator (安全导航运算符)**:`&.`用于调用可能...
- **Improved Proc and lambda**:Proc对象的行为更接近lambda,特别是在处理块的返回值时。 - **Performance enhancements**:对垃圾回收机制进行了优化,提升了整体运行效率。 Ruby-2.3.0还在错误处理、字符串...
- ** Proc and Lambda**:Proc 对象现在可以被转换为 Lambda,这使得块的行为更一致,尤其是在处理迭代器时。 2. **Windows 安装**: - `rubyinstaller-2.0.0-p353.exe` 是专为 Windows 用户设计的安装程序,包含...
3. **块、Proc和Lambda**:Ruby中的代码块是一种特殊的语法结构,可以与 Proc 和 Lambda 对象关联,用于创建可重用的代码片段。 4. **模块(Module)**:Ruby的模块用于实现命名空间、混合(Mix-in)功能,以及提供...
价值评估将任意值包装到可同步事件中。 事件的同步结果是原始值,但有两个例外:... By default, syncing on a procedure syncs to the return value> (define proc (lambda () (+ 2 2)))> (sync (value-evt proc))4
根据提供的文件信息,本书《Pro C# 5.0 and the .NET 4.5 Framework》由Andrew Troelsen编写,是一本面向中级到高级.NET开发者的专业书籍。本书旨在为读者提供C# 5.0及.NET 4.5框架的深入理解与实践指导。 ### 1. ...
3. **块、proc和lambda**:这些是Ruby中实现函数式编程的关键,用于定义可复用的代码片段,并可以在适当的地方传递。 4. **元编程**:Ruby允许在运行时修改自身,这是其强大之处。书中会介绍如何利用`class_eval`、...
6. 可能还包括异常处理、函数式编程元素(如Proc和Lambda)、元编程(Metaprogramming)等高级话题,这些内容能够帮助开发者更好地理解和利用Ruby的灵活性。 通过学习《Ruby for Rails》,开发者不仅能掌握Ruby语言...
5. ** Proc 和 Lambda**: `Proc`和`lambda`是可调用的对象,可以存储代码块。它们的区别在于对参数数量和返回语句的处理,`lambda`更接近于传统的函数行为。 6. **符号(Symbols)**: Ruby中的符号是不可变的字符串...
3. **块、 Proc 和 Lambda**:Ruby提供了处理代码块的能力,Proc和Lambda是可存储的代码块,可以作为参数传递和作为方法返回。 4. **元编程**:Ruby允许在运行时修改和创建类和方法,这使得编写自定义的代码生成和...
一个将添加到 (包括lambda )和Ruby库。 当前版本: 1.0.0 支持的Ruby版本: 1.9.2、1.9.3、2.0、2.1、2.2 安装 gem install comp -v '~> 1.0' 或者,在您的Gemfile : gem 'comp' , '~> 1.0' 用法 require '...
**4.1 块、Proc 和 Lambda** - **块**:一段可以作为参数传递给方法的代码。 - **Proc 对象**:可调用的过程对象。 - **Lambda**:更严格的形式化过程对象。 **4.2 线程和并发** - **线程创建**:使用 `Thread....
使用`Proc`和`lambda`可以使块成为一等公民,并且可以存储和传递。 8. 代码块和调用约定(Hooks and Callbacks):在元编程中,经常需要在某些方法调用前后执行特定的代码。Ruby允许你定义`before`、`after`和`...
- Lambda与Proc的区别 #### 四、Methods and Modules(方法与模块) Ruby是一门非常注重面向对象编程的语言,本章将详细介绍如何定义和使用方法(函数),以及如何通过模块(Module)来实现代码复用。 **知识点...
由于标签是 "Ruby",我们可以进一步推测项目可能深入到 Ruby 语言的一些特性,比如元编程、面向对象编程、块(blocks)、Proc 对象和 Lambda 函数等。Ruby 以其简洁、表达性强的语法而著名,使得代码更易于理解和...
块可以转换为lambda或Proc对象,形成闭包,保留其定义时的上下文。 3. **Gem**:Ruby的包管理系统,允许开发者共享和安装第三方库,如Rails(一个流行的Web开发框架)、ActiveRecord(ORM,对象关系映射)等。 4. **...