ruby中的block是比较难理解的一个概念,但是如果你懂得了什么是回调函数。那么其实block的作用和回调函数是一样的。
我们先看一个没带参数的例子:
def say
yield
yield
end
我们先看单行的block。
say{puts("hello world")}
输出的结果为:
hello world
hello world
block就象是一个没有名称的函数,执行到yield就调用block中的代码执行。
如果block是多行的,那么就应该是这样:
say do
puts("hello world")
puts("ni hao");
end
输出结果:
hello world
ni hao
hello world
ni hao
每一个yield就是执行完block中所有的代码。
接下去我们看看带有参数的block。
def add
puts(yield(1,2))
puts(yield(5,6))
end
add{|a,b| a+b}
输出的结果:
3
11
block中的a,b就是这个block的参数,yield(1,3)就是调用这个block,并把1,3赋给a和b。
Ruby中方法和块的关系就是一对协同例程,互相转换程序的控制执行权,当方法中遇到yield语句,就转到块里执行,块执行完毕后,将返回到方法体中,继续执行方法yield语句后面的代码。yield可以带参数到块中,块也是有返回值,返回到方法体中。
方法和块的一个作用,就是实现了操作和处理的分离,比如:File.open {...},File.open负责打开文件(即是操作),然后呢,如何处理呢,交给了块。Ruby创立者这种思想,深刻地理解了,如何更贴近自然的语 言,更加深入的面向对象,更加的灵活(比如Array.each方法,只是负责取出数组中的每个元素,具体要干什么,块可以自由的设定)。
方法可以通过 if 语句加上 block_given? 条件,来判断方法在执行的时候,是否有块在后面,如果有,就执行if语句,再根据yield调用块,如果后面没有块,就继续执行if后面的代码。
块只是接过方法交过来的执行权,继续执行块的代码,它不是一个结构,不是循环。
下面是个例子,File.open方法后跟块的时候,可以在结束块时,自动关闭文件,完善了File.new方法。
class File
def File.open(*args) #将File.new方法需要的一篮子参数放到*args数组里
r=f=File.new(*args) #将数组*args分散开并传给File.new ,为什么这里要把句柄给两个值?
if block_given? #block_given?方法属于Kernel模块,而此模块包含在Object中,
begin #定义一个begin结构,以便即使有错误,也可以执行ensure语句
r=yiled f # f传递到块中,r接受了块的返回值。
ensure
f.close #不管有没有错误,都会在退出块时,关闭文件,关闭文件,
end #可以确保缓存的东西都写入文件,并且可以交出占用的资源。
end
return r #如果不存在块,直接返回r
end
end
分享到:
相关推荐
在Ruby中,block并不罕见。官方对block的定义是“一段被包裹着的代码”。当然,我觉得这样的解释不会让你变的更明白。 对block的一种更简单的描述是“一个block就是一段存储在一个变量中的代码,它和其他的对象一样...
深入理解Ruby中的block概念,是理解Ruby编程的关键之一。Block在Ruby中扮演着代码块的角色,它可以被看作是高阶函数的一种特殊形式的语法。虽然Ruby不支持First-class functions,即函数不是一等公民,但block使得...
Block是Ruby语言中的一个非常重要的特性,可以将其理解为一段可执行的代码片段。它能够像参数一样被传递,并且在方法调用中被激活。Block的强大之处在于它不仅提高了代码的可读性和简洁性,还极大地增强了程序的灵活...
Ruby的块(block)、 Proc 和 Lambda 是实现回调和高阶函数的关键。 元编程是Ruby的一大特色,它允许你在运行时修改代码。Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`...
Ruby的块(Block)和 Proc 对象是其独特功能之一。块是一段可以在函数或方法中传递的代码,通常由`do..end`或花括号`{}`包裹。Proc对象可以捕获一个块并存储起来,之后在需要时调用。Lambda也是类似的概念,但它们在...
### Eloquent Ruby:深入探索Ruby语言的魅力 #### 引言 《Eloquent Ruby》是一本深受Ruby...通过阅读本书,你可以更加深刻地理解Ruby语言的设计理念,掌握其实现复杂功能的方法,并最终成为一名真正的Ruby专家。
本教程针对初学者,旨在帮助读者快速掌握Ruby的基础知识,并通过实例深入理解其用法。 首先,Ruby的基本语法是它的一大亮点。Ruby允许开发者以更自然的方式编写代码,这得益于它的语法接近于英语。例如,变量的声明...
1. **Ruby内部机制揭秘**:每章末尾都包含“Digging Deeper”部分,揭示Ruby运行时的各种细节,如作用域解析、多线程实现等,帮助读者更好地理解语言本身的设计理念。 2. **陷阱与注意事项**:通过实际案例分析常见...
Ruby是一种高效且灵活的面向对象编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年创建,旨在提供一种易于理解、简洁且强类型的编程体验。它的设计理念是结合Smalltalk的面向对象特性、Perl的文本处理能力...
Ruby是一种面向对象的脚本...通过分析`example1`和`example3`这样的代码,你可以逐步理解类定义、对象创建、方法调用等核心概念,并逐渐熟悉Ruby的编程风格。实践这些例子,将有助于深化对Ruby的理解,提高编程技能。
Ruby语言的帮助文档是学习和理解其语法、类库、方法和框架的重要资源。 这个"ruby语言帮助文档(简体中文)"包含了Ruby的所有基础知识,从语言特性到高级概念,为初学者和经验丰富的开发者提供了全面的指导。以下是...
另外,Ruby的块(Block)和块语法是其独特之处,可以用于迭代、回调和延迟执行等功能。 Ruby的控制结构包括条件语句(如if/else、case)、循环(如while、for、until)以及异常处理(如begin/rescue/ensure)。Ruby...
- 方法:Ruby中的方法可以定义在类、模块或对象上,支持块(block)和Proc对象。 - 控制结构:包括条件语句(如if、unless)、循环(如for、while、until、each)和流程控制(break、next、redo、retry)。 2. **...
书中还将详细介绍Ruby的块(block)、Proc 和 Lambda,这些都是Ruby实现回调和闭包的关键工具。通过它们,你可以编写出更简洁、更具表达力的代码。此外,Ruby的迭代器和集合操作,如map、reduce、select等,提供了...
Ruby还支持块(block),这是一种特殊的语法结构,常与迭代器配合使用,使得代码更加简洁。 面向对象编程是Ruby的强项。本书将深入探讨类和对象的概念,以及如何使用继承、封装和多态性来设计和实现复杂的软件结构...
Ruby中的块(Block)、 Proc 和 Lambda 是其元编程能力的重要体现。它们允许你在运行时创建和修改代码,这在编写高度定制和自适应的程序时非常有用。文档会详细介绍这些概念及其在实际编程中的应用。 此外,Ruby...
为了深入理解代码,再次认真学习了一下 Ruby 的闭包,特别是 block,proc 和 lambda 几种用法的异同,这次的周记就和大家分享一下心得。 闭包是 Ruby 相对其它语言特别优势之一,很多语言有闭包,但是唯有 Ruby 把...
Ruby的中文文档,如“ruby中文文档.chm”,是学习和理解这一语言的重要资源。这份文档通常会包含以下关键知识点: 1. **基础语法**:Ruby的基础语法包括变量(本地变量、实例变量、类变量和全局变量)、常量、...