我们总是希望对未知事件分类.当它发生时,向其它方法传递一块作为参数的代码是最容易地解决方法,也就是说我们希望像处理数据一样处理代码.一个新的过程对象可以通过proc创建:ruby> quux = proc { | print "QUUXQUUXQUUX!!!\n" | } #<Proc:0x4017357c> 现在quux指向一个对象,像...
http://www.jb51.net//article/12877.htm
Ruby的模块非常类似类,除了:模块不可以有实体 模块不可以有子类 模块由module...end定义.实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看下去吧.模块有两种用法.其一是将相近的方法和实体放在一个相对集中的域里.Ruby标准包里的Math模块就扮演着这一角色:ruby> Math.sqrt(2) 1.41421ruby> Math::PI 3.14159 ::操作符告诉 Ruby&nbs...
http://www.jb51.net//article/12876.htm
实体的行为取决于其类,但很多时候我们知道一个特定的实体需要特定的行为.在很多语言里,我们必须陷入另外再定义一个类的麻烦里,即使它只是用来接着实体化一次.在Ruby里,我们可以赋予任何对象属于其自身的方法.ruby> class SingletonTest | def size | print "25\n" |&...
http://www.jb51.net//article/12875.htm
前面,我们说Ruby没有函数,只有方法.而且实际上有不止一种方法.这一节我们介绍访问控制(access controls). 想想当我们在"最高层"而不是在一个类的定义里定义一个方法时会发生什么.我们可以把这样的方法设想为在像C那样的传统语言中的函数的类似物.ruby> def square(n) | n * n | end nilruby>&...
http://www.jb51.net//article/12874.htm
在子类里,我们可以通过重载父类方法来改变实体的行为.ruby> class Human | def identify | print "I'm a person.\n" | end | de...
http://www.jb51.net//article/12873.htm
在日常生活中,我们对一切对象的分类都是有一定层次的.我们知道所有的猫都是哺乳动物,而所有的哺乳动物又都是动物.小型的类从更大的类中继承它们的属性.如果一切的哺乳动物要呼吸,那么猫也要呼吸.在Ruby里,我们可以这样表述这一概念:ruby> class Mammal | def breathe | print "inhale and exhale\n...
http://www.jb51.net//article/12872.htm
现实世界满是对象,我们可以为他们分类.举个例子,非常小的孩子看见狗的时候,不管那是什么种类的,都会叫它们"bow-wow";我们天生有通过种类来了解世界的能力.在OO编程的术语里,像"狗"这样的一类对象称之为一个类,一些特殊的属于这个类的对象叫作类的实体(instance of that class).一般的,在Ruby或其它OO语言里创造一个对象首先得定义类的属性,接着再创造一个实体.为了说明这一点,让我们先来定义一个简单的Dog类.ruby> class Dog | ...
http://www.jb51.net//article/12871.htm
什么叫做一个方法呢?在OO编程里,我们不希望直接从外部操纵一个对象的数据;相反的,对象自己了解如何操纵自身(当被恰当地要求时).你也许会说我们传递一条消息给一个对象,那些消息就会调用某类行为或者做有意义的回复.这些都会在我们无需了解或关心这个对象内部工作机制的情况下发生.为我们所允许的可让其执行的作业(或等价的,它能听懂的消息)就是对象的方法. 在ruby里,我们通过点(dot notation,正如C++或Java)来调用一个对象的方法.被调用的对象在点的左方给出.ruby> "abcdef".length 6...
http://www.jb51.net//article/12870.htm
面向对象是一个挺让人迷惑的措辞.叫一切东西都是面向对象会让别人觉得你很时髦. Ruby 声称自己是面向对象的脚本语言;但究竟什么才是"面向对象"? 我们已经有了各种各样的答案,但所有这些恐怕都归结于同一件事.与其快速地概括它,不如让我们先花点儿时间考虑一下传统的编程模式.传统意义上,一个编程问题从出现的各种数据,以及处理数据的过程(procedures)着手.在这一模式下,数据是呆板,被动和无用的;它完全的求助于那个体积庞大的,主动的,逻辑性的,全能的过程体.这一做法的问题在于程序是由程序员写的,而他们仅仅能在工作中记下为数不多的细节.而随着工程的加大,它的核心也...
http://www.jb51.net//article/12869.htm
迭代器并不是Ruby发明的.它广泛地运用于各种面向对象语言.在Lisp中也有,只是不这么叫罢了.尽管如此,迭代器的概念并不为许多人熟悉,因此我们将在此做较为详细的介绍.你知道,动词 iterate 的意思是做同一件事许多遍,因此,iterator就是用来将同一件事做许多次的东西.当我们写代码时,我们需要各种环境下的循环.在C里,我们用for或者while.比如,char *str;for (str = "abcdefg"; *str != '\0'; str++) { &nb...
http://www.jb51.net//article/12868.htm
这章我们将讨论更多的Ruby流程控制.case我们用case语句测试有次序的条件.正如我们所见的,这和C,Java的switch相当接近,但更强大.ruby> i=8ruby> case i | when 1, 2..5 | print "1..5\n" | when 6..10  ...
http://www.jb51.net//article/12867.htm
