`
xvridan
  • 浏览: 37310 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Ruby 代码块

阅读更多
代码块:可以和方法调用关联的一系列代码,就好像这些代码是方法的参数一样,这是一个令人难以置信的强大特性。你可以使用代码块实现回调(但不像Java的匿名内部类那么简单),传递一系列代码(但要比C的函数指针更加复杂),和实现迭代器。

代码块是用大括号或者do...end括起来的一系列代码。
{ puts "Hello" }       # 这是一个代码块

do                           #
  club.enroll(person)        # 这也是代码块
  person.socialize           #
end

一旦你创建了一个代码块,就可以把它和一个方法调用关联在一起。那个方法能够调用代码块一次或者更多次,用Ruby的yield语句。下面的例子显示了这 个过程。我们定义一个方法,这个方法调用yield两次。然后我们调用这个方法,把代码块放在同一行中方法调用的后面(也是方法的所有参数的后面)。[有 些人喜欢把和方法关联的代码块当作是一种传递过来的参数。它们虽然是一个级别的,但这没有显示出所有的内涵。最好把代码块和方法当成是协同工作的关系,在 它们之间控制在来回交换。]
def callBlock
  yield
  yield
end

callBlock { puts "In the block" }

结果:
In the block
In the block

看看代码块中的代码(puts "In the block") 是如何被执行两次的,就是对yield的每一次调用。

你可以在调用yield时给出参数,这些参数传递给代码块。在代码块中,列举变量的名字来接受参数,这些参数被用"|"括着。

  def callBlock
    yield , 
  end

  callBlock { |, | ... }


代码块贯穿在实现迭代器的Ruby库中,迭代器就是一种方法,用来连续返回某种集合的元素,比如一个数组。
a = %w( ant bee cat dog elk )    # 创建一个数组
a.each { |animal| puts animal }  # 迭代所有的内容
 
produces: 
ant
bee
cat
dog
elk

我们来看看实现Array类的each迭代器的可能的方法,我们要用到前面的例子。each迭代器遍历数组的每个元素,每次都调用yield,类似的代码可能会是下面这样:
# 在Array类中...
def each
  for each element
    yield(element)
  end
end


这样你就可以使用数组的each方法来迭代数组元素提供给代码块,代码块依次在每个元素返回时被调用一次。

[ 'cat', 'dog', 'horse' ].each do |animal|
  print animal, " -- "
end

结果:
cat -- dog -- horse --


类似的,内置在语言比如C或者Java中的许多循环结构在Ruby中就是简单的方法调用,这个方法调用所关联的代码块0次或者更多次。
5.times {  print "*" }
3.upto(6) {|i|  print i }
('a'..'e').each {|char| print char }

结果: 
*****3456abcde


在这里,我们让数字5调用一个代码块5次,然后让数字3调用一个代码块,传递给它连续的数值直到6,最后,字符"a"到"e"的区间使用each方法调用一个块。

无衣 2007-02-10 13:31 发表评论
分享到:
评论

相关推荐

    Ruby中的block代码块学习教程

    Ruby中的代码块(block)是语言的核心特性之一,它允许开发者定义可执行的代码段,并在需要的时候通过`yield`关键字调用。代码块通常由`{}`或`do...end`包围,它们不是独立的类,但可以转换为`Proc`类的对象。对于初学...

    详解Ruby中的代码块及其参数传递

    接下来我们将深入探讨Ruby代码块的声明、块内变量的访问、`yield`语句以及代码块的参数传递,以及通过`instance_eval`等其他方式传递块。 首先,**块的声明**有两种主要形式:使用`{}`或`do..end`。`{}`通常用于...

    详解Ruby中的代码块对象Proc

    在Ruby编程语言中,代码块(block)是一种非常重要的特性,它允许程序员定义一段可执行的代码,并在需要时调用。然而,由于代码块本身不是对象,...理解并熟练运用Proc对象,能够帮助提升Ruby代码的灵活性和可维护性。

    ruby源代码 ruby源代码 ruby源代码 ruby源代码5

    4. 块和闭包:Ruby中的块是一段可以被传递、存储和执行的代码,与闭包紧密相关,支持函数式编程风格。 5. 自动内存管理:Ruby采用垃圾回收机制,自动处理内存分配和释放,减少了内存泄漏的风险。 6. 标准库:Ruby...

    Ruby 代码规范

    本篇文章将深入探讨Ruby代码规范,帮助开发者养成良好的编码习惯。 1. **命名规范** - 变量名:使用小写字母和下划线,例如 `user_name`。 - 常量名:全大写字母,单词间用下划线分隔,如 `MAX_USERS`。 - 类名...

    Ruby on Rails入门经典代码

    - Blocks与Procs:Ruby中的代码块用于传递代码,Procs是可存储的代码块,Lambda更接近函数行为。 - Symbols:不可变对象,常用于方法参数、哈希键等,以提高效率。 - Mixins:Ruby的模块系统允许类间共享代码,...

    Ruby-Chef是一个系统集成框架为整个架构提供配置管理功能

    食谱则包含了如何配置这些节点的指令,是一系列用于实现特定功能的Ruby代码块。库房是食谱的集合,它通常包含相关配置文件和依赖关系,用于在整个环境中进行部署。资源是Chef的基本构建块,代表了要在系统上执行的...

    ruby源代码7

    4. **块(Block)与 Proc**:Ruby支持代码块,通常由`do..end`或花括号`{}`包裹。Proc是代码块的可存储版本,可以作为参数传递或赋值给变量。 5. **闭包(Closure)**:Ruby的块和Proc具有闭包特性,即它们能记住...

    Ruby-Flay分析代码结构的相似之处

    2. **相似性检测**:它会将代码分解成独立的“代码块”,然后比较这些代码块之间的结构和内容。 3. **分数计算**:根据代码块的相似程度,Flay会为每一对相似代码块分配一个分数。 4. **报告生成**:最后,Flay会...

    ruby实战书、代码书.rar

    5. **异常处理**:如何使用`begin-rescue-end`块进行错误处理是Ruby编程中的重要一环,书里可能会讲解异常类和如何捕获及处理错误。 6. **文件和IO操作**:Ruby提供了方便的文件和输入/输出操作,书里可能包含读写...

    Ruby-RubyCritic一个Ruby代码质量报告工具

    RubyCritic是一款强大的Ruby代码质量报告工具,专为Ruby开发者设计,用于提升代码质量和可维护性。这款工具通过对代码进行静态分析,生成详细的评分、建议和改进意见,帮助开发者识别并修复潜在的问题,从而实现代码...

    深入理解Ruby中的代码块block特性

    ### 深入理解Ruby中的代码块block特性 在Ruby编程语言中,代码块(block)是一种非常重要的概念,它不仅频繁地出现在各种程序中,还具有独特且强大的功能。本文将详细介绍Ruby中的代码块特性,包括其定义、用法以及...

    07Ruby 块.docx

    在Ruby中,BEGIN和END块分别用于定义当文件被加载时要执行的代码块以及程序退出时要执行的代码块。 ##### 5.1 BEGIN块 - **定义**: 在文件的任何位置都可以定义BEGIN块,但其代码会在文件加载时执行。 - **示例**:...

    为何Ruby 1.9的不兼容性会导致原有Ruby代码无法工作

    总的来说,Ruby 1.9 是一个重大更新,它的目标是提升Ruby的效率和表达能力,但这也意味着开发者必须适应新的规则,更新他们的代码库以保持兼容性。这一过程既是一个挑战,也是Ruby语言不断演进的证明。对于那些希望...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    这个方法接受一个符号作为方法名和一个代码块,然后在指定的对象或类上创建一个新方法。 2. **类和模块的开放性**:Ruby的类和模块在运行时可以被修改,这意味着你可以在程序的任何时刻向它们添加新的方法或属性。`...

    Rails 中页面中常用函数

    ERB允许在HTML中嵌入Ruby代码,通过`<% %>`和`<%= %>`来区分纯Ruby代码块和输出表达式。前者执行代码但不输出,后者将Ruby表达式的结果输出到HTML。 2. **实例变量**: 在Rails的控制器中,我们通常会创建实例变量...

    daemons:Ruby守护程序gem官方存储库

    如果需要,还可以使用守护程序在守护进程中运行ruby代码块,并从主应用程序控制这些进程。 除了此基本功能之外,守护程序还提供了许多高级功能,例如异常回溯和日志记录(以防您的ruby脚本崩溃)以及监视和自动重启...

    swagger-blocks, 定义和服务 ruby 应用程序的动态更新 Swagger.zip

    swagger-blocks, 定义和服务 ruby 应用程序的动态更新 Swagger Swagger::Blocks Swagger::Blocks 是一个用于纯 ruby 代码块的DSL,可以转换为 JSON 。它帮助你以 Swagger 风格编写API文档,然后自动构建与 Swagger ...

Global site tag (gtag.js) - Google Analytics