`
fireDragonpzy
  • 浏览: 466707 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Ruby Base 之代码块、迭代子和过程对象

阅读更多
在Ruby中一切皆对象。甚至一个代码块也是一个对象!在Ruby中,代码对象被称为代码块。你可以把代码块想像成小的程序单元。它们包含Ruby代码并且能够在执行它们时转入到方法中。在Python,C和Java中与之类似的概念是函数指针,匿名函数,内部类和回调函数。
Ruby代码块的语法是,把Ruby代码放在大括号之间或放在do/end命令之间。如下所示:
{
#这是一个代码块...
}

do
#...并且这也是一个代码块
end

 在一个很简单的实例中,{puts"hello world"}就是一个有效的代码块。那么,你应该如何使用这些代码块并且把它们作为一组代码传递给一个方法呢?为此,首先要定义一个如下形式的简单方法:

def someMethod
yield
end


  命令yield把控制传递给代码块(它被传递给这个方法)。下面的代码向你展示,一个代码块是如何被传递到上面这个方法的。

irb(main):001:0> someMethod {puts "hello world"}
hello world


  每当调用yield时,执行传递到该方法的代码块。下面是另一个更复杂些的方法的例子,它使用了一个代码块来做更多的工作。

irb(main):001:0> 
def fibonacci (stop)
while stop < 20
stop=yield
end
end
=> nil
irb(main):006:0> 
i=0; j=1; fibonacci(j) {puts i; temp = i; i = j;j = temp + j}
0
1
1
2
3
5
8 

代码块被应用于整个Ruby中。最重要的是,代码块被Ruby内部地应用于象Array,Hash,甚至String这样一些类的iterator方法中。一个代码块其实就是,你定义要执行什么任务(典型地,是针对一个元素的任务)。为了进一步说明代码块和iterator的使用,我们提供了一个小例子。假定你定义了一些场院动物类(如图3所示),还有一个这些动物的数组,你可以通过在这个数组上使用一个代码块和一个迭代子来实现让每一种动物发声。


图3.简单的场院动物类

irb(main):031:0> 
barnYard = [Cow.new, Duck.new, Chicken.new, Horse.new, Dog.new]
=> [#<Cow:0x58d2f48>, #<Duck:0x58d2f30>, #<Chicken:0x58d2f00>, #<Horse:0x58d2ee8>, #<Dog:0x58d2ed0>]
irb(main):032:0> 
barnYard.each {|animal| animal.talk}
Mooooo
Quack
Cluck-cluck
Naaaay
Bark bark


  在barnYard上调用的每个方法正是一个数组上的iterator方法之一。注意,|符号用于定义要接收的参考。在本例情况中,代码块接收一个参数;也就是把barnYard中的每一种动物作为迭代子来遍历这个动物集合。

 迭代子和代码块甚至允许我们完成如下一些相当简单和整洁的事情:

irb(main):001:0> 
3.times {puts "Ruby is cool!"}
Ruby is cool!
Ruby is cool!
Ruby is cool!


  是的,即使是Integer类也提供了一个迭代子(times方法)-它使用一个代码块来快速地执行循环操作。

  在离开有关代码块和迭代子的讨论前,你还应该知道代码块可以被赋值给一个变量。事实上,这样的代码块实际上是Proc类的实例。你可以使用new方法来定义一个Proc实例,或者使用这些Proc实例-这些实例稍后可以使用call方法来调用。

irb(main):003:0> simpleProc.call
hello
=> nil
irb(main):004:0> anotherProc.call("hello yourself")
hello yourself
=> nil


  这允许一个可重用的代码块可以被包装为一个对象(它可以在任何地方执行)而进行传递。下面是显示Ruby中可重用代码的示例!

irb(main):001:0> 
def simpleMethod(aProc)
puts "Is Ruby cool or what?"
aProc.call("Way cool dude!")
end
=> nil
irb(main):005:0> 
simpleMethod(anotherProc)

分享到:
评论

相关推荐

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    详解Ruby中的代码块对象Proc

    在Ruby编程语言中,代码块(block)是一种非常重要的特性,它允许程序员定义一段可执行的代码,并在需要时调用。然而,由于代码块本身不是对象,有时我们需要将其转换为对象以便于存储、传递或作为参数使用。这就是...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码3

    ruby源代码 ruby源代码 ruby源代码 ruby源代码3

    Ruby中的block代码块学习教程

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

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

    Ruby中的代码块是语言的核心特性之一,它们允许程序员在函数或方法中定义匿名代码段,使得代码更加灵活和模块化。接下来我们将深入探讨Ruby代码块的声明、块内变量的访问、`yield`语句以及代码块的参数传递,以及...

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

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

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

    ruby 资源(代码范例)

    Ruby是一种强大的、面向对象的编程语言,以其简洁的语法和强大的功能著称。在Web开发领域,Ruby on Rails(简称Rails)是一个非常流行的开源框架,它基于MVC(Model-View-Controller)架构模式,极大地提高了开发...

    ruby测试代码6

    标题“ruby测试代码6”和描述“ruby测试代码6”暗示了这是一个关于使用Ruby语言进行的测试代码项目,可能涉及到不同的模块或者数据结构。标签“ruby测试代码6”进一步确认了这一主题。从压缩包子文件的文件名称列表...

    Ruby on Rails入门经典代码

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

    Ruby的迭代之道:each与map的较量

    ### Ruby 的迭代之道:`each`与`map`的较量 #### Ruby 语言简介 Ruby 是一种高级的、面向对象的编程语言,由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)于 1995 年创建。其设计目标旨在实现简单、自然且强大...

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

    Ruby是一种面向对象的脚本语言,它以其简洁的语法和强大的功能受到许多开发者的喜爱。在进行大型项目或团队协作时,保持代码的整洁和一致性至关重要。这就是代码分析工具如"Flay"发挥作用的地方。Flay是Ruby社区中的...

    探索Ruby编程艺术:块(Block)与迭代器(Iterator)的奥秘

    Ruby语言的设计哲学强调了简单和生产力,它融合了多种编程范式,包括面向对象、命令式、函数式和过程式编程。 Ruby的主要特点包括: 1. **纯粹的面向对象**:在Ruby中,一切都是对象,包括基本数据类型。 2. **...

    ruby实战书、代码书.rar

    Ruby是一种面向对象的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。这本书籍集合包含了两本关于Ruby的实用书籍——"Ruby程序设计"和"the+ruby+way",它们都是深入理解并提升Ruby编程技能的宝贵资源。 ...

    ruby源代码8

    它强调简洁、优雅的语法和高效的编程效率,同时也支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。在Ruby中,一切都是对象,这使得它的编程模型非常灵活。 标题“ruby源代码8”可能是指一系列与Ruby...

    Ruby元编程 源代码 Metaprogramming Ruby source code

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

    ruby源代码7

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。源代码是任何编程语言的核心,它包含了程序的逻辑和实现细节。在Ruby的世界里,源代码通常是`.rb`文件,它们由一系列的...

Global site tag (gtag.js) - Google Analytics