前面一节的 Fruit 类有两个实变量,分别表述水果的类型和状态.直到为这个类写了一个定制的inspect方法,我们方才了解它不会对一个缺乏属性的水果做出合理的解释.幸运的是,Ruby提供了一种允许实变量总是被初始化的方法.initalize方法当Ruby创建一个新对象时,它总是会寻找一个名为 initialize 的方法并执行它.因此,我们可以简单通过一个initialize方法向实变量中加入缺省值,这样一来, inspect方法就有东西可说了.ruby> class Fruit &...
http://www.jb51.net//article/12886.htm
什么是一个存取器?我们在前面已经讨论过实变量了,但却未过多的讨论.一个对象的实变量属于它的属性,也是它与其它来自同一个类的对象的一般区别.读写它的属性是重要的;这样做需要做一个叫着属性存取器(attribute accessors)的方法.我们将很快看到我们并不是总要明确地写出存取器方法,但现在先让我们了解所有的细节.存取器的两种类型是写(writer)和读(reader).ruby> class Fruit | def set_kind(k) &...
http://www.jb51.net//article/12885.htm
当一个方法结束工作时我们也许需要进行清理工作.也许一个打开的文件需要关闭,缓冲区的数据应清空等等.如果对于每一个方法这里永远只有一个退出点,我们可以心安理得地将我们的清理代码放在一个地方并知道它会被执行;但一个方法可能从多个地方返回,或者因为异常我们的清理代码被意外跳过.begin file = open("/tmp/some_file", "w") # ... write to the file ... file.closee...
http://www.jb51.net//article/12884.htm
一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据.ruby> file = open("some_file")ERR: (eval):1:in `open': No such file or directory - some_file 一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到检查每一个可能导致错误发生的系统调用的返回值并...
http://www.jb51.net//article/12883.htm
一个常量由大写字母开头.它应最多被赋值一次.在Ruby的当前版本中,常量的再赋值只会产生警告而不是错误(non-ANSI版的eval.rb不会报告这一警告)ruby>fluid=30 30ruby>fluid=31 31ruby>Solid=32 32ruby>Solid=33 (eval):1: warning: already initialized constant S...
http://www.jb51.net//article/12882.htm
局部变量由小写字母或下划线(_)开头.局部变量不像全局和实变量一样在初始化前含nil值.ruby> $foo nilruby> @foo nilruby> fooERR: (eval):1: undefined local variable or method `foo' for main(Object) 对局部变量的第一次赋值做的很像一次声明.如果你指向一...
http://www.jb51.net//article/12881.htm
一个实变量由@开头,它的范围限制在 self 对象内.两个不同的对象,即使属于同一个类,也可以拥有不同值的实变量.从对象外部来看,实变量不能改变甚至观察(比如, Ruby的实变量从来不是公用的),除非方法由程序员明确声明.像全局变量一样,实变量在初始前的值是nil.Ruby的实变量用不着声明.这暗含着对象的弹性结构.实际上,每个实变量都是在第一次出现时动态加入对象的.ruby> class InstTest | def set_foo(n...
http://www.jb51.net//article/12880.htm
全局变量由$开头.它们可以在程序的任何位置访问到.在初始化前,全局变量有一个特殊的值 nil.ruby> $foo nilruby> $foo = 5 5ruby> $foo 5 应谨慎使用全局变量.由于在任何地方都可以被写因此他们相当危险.滥用全局变量会导致很难隔离臭虫;同时也视为程序的设计未经严格考虑.当你发现必须要使用全局变量时,记得给它一个不会在其它地方一不小心就用到的描述性...
http://www.jb51.net//article/12879.htm
Ruby有三类变量,一种常量和两种严格意义上的伪变量(pseudo-variables).变量和常量都没有类型.虽然无类型变量存在一定的缺点,但却有更多的优点并很好的符合Ruby快速简便(quick and easy)的哲学精神.在大多数语言里,变量都必须指定其类型,可更改性(是不是个常数)和范围;由于类型的不存在,剩下的东西也可由变量名字很快确定(你马上会看见),在Ruby里我们不需要变量声明.由首字母标识符将其分类:$ 全局变量 &...
http://www.jb51.net//article/12878.htm
我们总是希望对未知事件分类.当它发生时,向其它方法传递一块作为参数的代码是最容易地解决方法,也就是说我们希望像处理数据一样处理代码.一个新的过程对象可以通过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
