参考手册:标准库——异常类
admin
|
1#
admin 发表于 2007-06-16 14:32
参考手册:标准库——异常类
Object
所有类的超类.它定义了对象的一般行为. 包含的模块: * Kernel 方法: self == other 若self 等于 other 则返回真.默认情况下,它的效果等同于equal?. 应该根据各类的具体性质来重新定义该方法. self =~ other 该方法可支持将正则表达式对象置于右边的,形如 obj =~ /RE/ 的正则表达式的匹配过程.通常返回false. 根据此定义,例如 nil =~ /re/ 通常返回 false . self === other 该方法通常用在case的比较句中.默认情况下,它的运作等同于Object#==,但在子类中进行归属检测时,需要对其进行适当的再定义. class type ((<obsolete>)) 返回被调(receiver)的类. ruby 1.7 特性: 在1.7 版本中,type已被停用. clone dup 生成某对象的拷贝并返回它. clone生成的是完整的拷贝,它包括freeze、taint和特殊方法等信息; 而dup则只拷贝对象的内容. 请注意,clone 和 dup 生成的都是"浅层(shallow)"拷贝.它们只拷贝对象本身,而不会拷贝对象的所指(例如数组的元素等). 另外,如果对拷贝进行如下php?name=%B2%E2%CA%D4" onclick="tagshow(event)" class="t_tag">测试的话 obj.equal?(obj.clone) 通常都不成立.但是 obj == obj.clone 通常都会成立. 若想对true, false, nil, Symbol对象等进行拷贝时,会引发TypeError异常. ruby 1.7 特性: 在1.7版本中,若想对Numeric对象等immutable(内容不可改变)的对象进行拷贝时,会引发TypeError. display(out = $stdout) 将对象输出到 out. 其定义如下. class Object def display(out=$stdout) out.print to_s nil end end 返回nil. eql?(other) 若两个对象相等则返回真.常用来判断Hash中的两个索引是否相同. 在对该方法进行再定义的同时,也必需对Object#hash方法进行再定义. 默认情况下,eql?的定义与equal?相同,即判断对象的同一性. equal?(other) 若other就是self自己时,即返回真. 该方法不能再定义. extend(module ... ) 将参数所指模块的实例方法追加为self的特殊方法.返回self. include负责向类(的实例)追加功能,而extend则只向某特定的对象追加模块的功能. module Foo def a 'ok' end end obj = Object.new obj.extend Foo p obj.a #=> "ok" 换言之,extend的功能就是"面向特殊类的include". ruby 1.7 特性: 若参数中包含了多个模块时,将从最后最后的参数开始逆向进行extand. freeze 禁止修改对象的内容.返回self. 若强行修改则会引发TypeError异常. frozen? 若某对象禁止修改其内容则返回真. hash 返回对象的哈希表值.用来在Hash类中保存对象. 当A.eql?(B)成立时,则A.hash == B.hash也必须成立.若再定义eql?时,也必须对该方法进行再定义. 默认情况下,它的返回值与Object#id的返回值相同.但是,只有Fixnum,Symbol和String使用内部哈希表函数(不可改变). 再定义hash时,将返回任意整数. id ((<obsolete>)) __id__ object_id ((<ruby 1.7 特性>)) 返回与各个对象对应的唯一的整数.但是,为某对象分配整数的具体情形并不固定. 为了应对您对id方法进行再定义,Ruby提供了别名__id__,我们推荐您在库中使用后者.另外,请不要对__id__进行再定义. ruby 1.7 特性: 在1.7版本中,id已被停用. inspect 将某对象转为人工可读的字符串并返回该字符串. 内部函数p就是使用该方法来表示某对象的. instance_eval(expr, [fname, [lineno=1]]) instance_eval {|obj| ... } 在对象的context中计算字符串expr并返回结果. 若给出了fname和lineno的话,将假定字符串位于在文件fname的第lineno行,然后开始编译,并能显示文件名/行号等栈跟踪信息. 若给出了块的话,将在对象的context中计算该块并返回结果.self将被传递给块的参数obj. 在对象的context进行计算是指,将self设为那个对象然后开始执行.同时,若在字符串/块中定义了方法的话,则相当于定义了self的特殊方法. 但是,局部变量将被instance_eval内部和外侧的作用域所共享. 注: 若在方法定义中,使用instance_eval 的块来定义一个方法的话,将会导致"nested method definition"编译错误. 这主要是受到Ruby语法分析器的限制所致. def foo instance_eval { def bar # <- 被看做嵌套的方法定义 "bar" end } end # => -:4: nested method definition 若使用字符串传递形式则可绕过该限制. def foo instance_eval %Q{ def bar "bar" end } end # 执行foo时,定义bar函数(实际上是 # foo的receiver的方法) foo p bar # => "bar" ruby 1.7 特性: 已经取消了对嵌套方法定义的限制.而且,在1.7以后的版本中,即使不使用instance_eval 也可达到同样的效果(严格说来,还是有所不同的.请参考方法定义的嵌套). def foo def bar "bar" end end foo p bar # => "bar" 另外,请参考Module#module_eval,Module#class_eval. instance_of?(klass) 若self为klass类的直接的实例时,返回真. 通常,当obj.instance_of?(c)成立时,obj.kind_of?(c)也是成立的. 请参考kind_of?. instance_variable_get(var) ruby 1.8 特性 取得并返回对象的实例变量的值. 可以使用字符串或者Symbol来向var指定实例变量名. 若实例变量尚未定义,则返回nil. class Foo def initialize @foo = 1 end end obj = Foo.new p obj.instance_variable_get("@foo") # => 1 p obj.instance_variable_get(foo) # => 1 p obj.instance_variable_get(bar) # => nil instance_variable_set(var, val) ruby 1.8 特性 将val的值赋值给对象的实例变量并返回该值. 可以使用字符串或Symbol来向var设定实例变量名. 若实例变量尚未定义,则重新定义. obj = Object.new p obj.instance_variable_set("@foo", 1) # => 1 p obj.instance_variable_set(foo, 2) # => 2 p obj.instance_variable_get(:@foo) # => 2 instance_variables 以字符串数组的形式返回对象的实例变量名. obj = Object.new obj.instance_eval { @foo, @bar = nil } p obj.instance_variables # => ["@foo", "@bar"] 另外,请参考local_variables,global_variables,Module.constants,Module#constants,Module#class_variables. is_a?(mod) kind_of?(mod) 只要self是下列任何一个类的实例就返回真,这些类是:mod类和它的子类,以及包括mod模块的类和它的子类. module M end class C < Object include M end class S < C end obj = S.new p obj.is_a? S # true p obj.is_a? M # true p obj.is_a? C # true p obj.is_a? Object # true p obj.is_a? Hash # false 另外,请参考instance_of?, Module#===. method(name) 将self的方法name对象化后得到Method对象并返回该对象.可以使用字符串或Symbol来指定name. 另外,请参考Module#instance_method. method_missing(name, args, ... ) Ruby在某方法尚未定义时,就调用该方法. 调用失败的方法名(Symbol)和当时的参数被传递给name和arg .... 默认情况下,该方法将引发NameError异常. methods public_methods private_methods protected_methods methods([inherited_too]) ((<ruby 1.8 特性>)) public_methods([inherited_too]) ((<ruby 1.8 特性>)) private_methods([inherited_too]) ((<ruby 1.8 特性>)) protected_methods([inherited_too]) ((<ruby 1.8 特性>)) 以字符串数组的形式返回某方法能理解的 public/private/protected 方法名列表. methods与instance_methods相同.ruby 1.7 特性: methods以数组形式返回public和protected方法名的列表. ruby 1.8 特性: 可以使用参数了.若inherited_too为真,就会搜索超类中定义的方法.默认值为真. methods(false)与singleton_methods(false)相同. 例: class Foo private; def private_foo() end protected; def protected_foo() end public; def public_foo() end end class Bar < Foo end p Bar.new.methods - Object.new.methods p Bar.new.public_methods - Object.new.public_methods p Bar.new.private_methods - Object.new.private_methods p Bar.new.protected_methods - Object.new.protected_methods => ["public_foo"] # version 1.7 以后、["protected_foo", "public_foo"] ["public_foo"] ["private_foo"] ["protected_foo"] 另外,请参考Module#instance_methods, Module#public_instance_methods, Module#private_instance_methods, Module#protected_instance_methods. 请参考Object#singleton_methods. nil? 若receiver为nil则返回真. respond_to?(name[, priv=false]) 若对象中包含名为name的public方法时返回真. name可以是Symbol或字符串.若priv为真时,则对private 方法也会返回真. send(name[, args ... ]) send(name[, args ... ]) { .... } __send__(name[, args ... ]) __send__(name[, args ... ]) { ... } 调用对象的name方法,并将args传给该方法的参数,然后返回方法的结果. 若是带块调用的话,也会把块原封不动地传给方法.方法名name可以是字符串或Symbol. 为了应对您对send进行的再定义,Ruby提供了别名__send__,在库中应该使用后者.另外,请不要对__send__进行再定义. send和__send__不受调用限制的影响,可以调用任何方法. singleton_methods singleton_methods([inherited_too]) ((<ruby 1.7 特性>)) 以字符串数组的形式返回该对象中定义的特殊类名的列表. ruby 1.7 特性: 可以指定参数了.若inherited_too为伪(1.8.0之前的默认值为伪,1.8.1之后的默认值为真),则不会显示超类中定义的方法名. ruby 1.8 特性: 可以返回public或protected属性的特殊方法名的列表了.特别是,当singleton_methods(false)时,它等同于methods(false). obj = Object.new module Foo private; def private_foo() end protected; def protected_foo() end public; def public_foo() end end class <<obj include Foo private; def private_bar() end protected; def protected_bar() end public; def public_bar() end end p obj.singleton_methods p obj.singleton_methods(false) # => ["public_foo", "public_bar", "protected_foo", "protected_bar"] ["public_bar", "protected_bar"] Object#extend是面向特殊类的include,所以下例也是如此. obj = Object.new module Foo private; def private_foo() end protected; def protected_foo() end public; def public_foo() end end obj.extend(Foo) p obj.singleton_methods p obj.singleton_methods(false) # => ["public_foo", "protected_foo"] [] 对于类方法(类对象的特殊方法)来说,若参数为真时,则会显示超类中的类方法名. class Foo def Foo.foo end end class Bar < Foo def Bar.bar end end p Bar.singleton_methods #=> ["bar", "foo"] p Bar.singleton_methods(false) #=> ["bar"] taint 设定对象的"污染标记".返回self. 关于对象的污染问题,请参考安全模型. tainted? 若对象已经有"污染标记"则返回真. 关于对象的污染问题,请参考安全模型. to_a ((<obsolete>)) 将对象转换为数组之后返回该数组. 若遇到不能转为数组的对象时,将返回只包含该对象本身且长度为1的数组. (ruby 1.7 特性: 以后可能会取消Object的这个方法.在1.7版本中将显示警告)。 例 p( {'a'=>1}.to_a ) # [["a", 1]] p ['array'].to_a # ["array"] p 1.to_a # [1] (warning: default `to_a' will be obsolete) p 'str'.to_a # ["str"] ruby 1.8 特性:在多重赋值表达式的右边出现带*的对象时,若该对象中定义了to_a方法的话,就使用它.若没有的话,就把它转换为只包含自身且长度为1的数组,然后再进行赋值. class Foo def to_a [1, 2, 3] end end a, b, c = *Foo.new p [a, b, c] # => [1, 2, 3] to_ary 将对象转换为数组并返回该数组. 若需要将对象隐式地转换为数组时,会在内部自动调用. 若某对象中定义了该方法时,就可以把它单独置入多重赋值表达式的右边进行调用. class Foo def to_ary [1, 2, 3] end end a, b, c = Foo.new p [a, b, c] => [1, 2, 3] to_hash 若需要将对象隐式地转换为哈希表时,会在内部自动调用. to_int 若需要将对象隐式地转换为整数时,会在内部自动调用. to_s 将对象转换为字符串并返回该字符串. 如果把非字符串对象当做参数传给print或sprintf时,将调用该方法把非字符串对象转换为字符串. to_str 若需要将对象隐式地转换为字符串时,会自动调用它. untaint 取消对象的"污染标记".返回self. 取消污染标记所带来的风险由程序员承担. 若安全等级在3以上时,会引发SecurityError异常. 关于对象的污染问题,请参考安全模型. private方法: initialize 用户定义类的对象初始化方法. 在对由Class#new新生成的对象进行初始化时要调用该方法.默认情况下,没有任何的动作.通常会在子类中根据需要对其进行再定义.传递给Class#new的参数会被原封不动地传递给initialize. initialize方法会被自动地设定为 private类型. initialize_copy(obj) ruby 1.8 特性 (基于扩展库)用户定义类的对象拷贝(clone,dup)的初始化方法. 该方法以obj的内容来置换self. 但self的实例变量以及特殊方法不会发生变化. 当receiver被freeze时,或者obj的类与receiver的类不同时,将引发TypeError异常. 在默认情况下(Object#initialize_copy)只会进行上述的freeze检查和类型检查,然后就返回self. obj.dup对新生成的对象调用initialize_copy obj2 = obj.class.allocate obj2.initialize_copy(obj) 对obj2,则拷贝obj的污染状态,实例变量,finalizer,然后生成拷贝.而clone甚至会拷贝特殊方法. obj = Object.new class <<obj attr_accessor :foo def bar :bar end end def check(obj) puts "instance variables: #{obj.inspect}" puts "tainted?: #{obj.tainted?}" print "singleton methods: " begin p obj.bar rescue NameError p $! end end obj.foo = 1 obj.taint check Object.new.send(:initialize_copy, obj) # => instance variables: #<Object:0x4019c9d4> # tainted?: false # singleton methods: #<NoMethodError: ...> check obj.dup # => instance variables: #<Object:0x4019c9c0 @foo=1> # tainted?: true # singleton methods: #<NoMethodError: ...> check obj.clone # => instance variables: #<Object:0x4019c880 @foo=1> # tainted?: true # singleton methods: :bar initialize_copy主要用来拷贝Ruby解释器无法理解的信息.例如有时使用C语言来定义类,而有时不想让实例变量保存信息,此时,若使用initialize_copy将这些内部信息拷贝下来的话,就不必对dup或clone进行再定义了. initialize_copy方法会自动被设定为private类型. remove_instance_variable(name) 从对象中删除实例变量name,并返回该实例变量中的值.name可以是Symbol或字符串. 若对象中不包含实例变量name的话,将引发NameError异常. class Foo def foo @foo = 1 p remove_instance_variable :@foo # => 1 p remove_instance_variable :@foo # => instance variable @foo not defined (NameError) end end Foo.new.foo 请参考Module#remove_class_variable, Module#remove_const. singleton_method_added(name) 若追加了特殊方法时,解释器会调用此方法.name可以是被追加的方法名或Symbol. class Foo def singleton_method_added(name) puts "singleton method \"#{name}\" was added" end end obj = Foo.new def obj.foo end => singleton method "foo" was added 若想对普通的方法追加过程添加钩子时,可使用Module#method_added. singleton_method_removed(name) ruby 1.7 特性 若使用Module#remove_method删除特殊方法时,解释器会调用此方法.name可以是被删除的方法名或Symbol. class Foo def singleton_method_removed(name) puts "singleton method \"#{name}\" was removed" end end obj = Foo.new def obj.foo end class << obj remove_method :foo end => singleton method "foo" was removed 若想对普通的删除方法过程添加钩子时,请使用Module#method_removed. singleton_method_undefined(name) ruby 1.7 特性 当特殊方法因Module#undef_method或undef的关系而处于未定义状态时,解释器就会调用此方法.name可以是未定义的方法名或Symbol. class Foo def singleton_method_undefined(name) puts "singleton method \"#{name}\" was undefined" end end obj = Foo.new def obj.foo end def obj.bar end class << obj undef_method :foo end obj.instance_eval {undef bar} => singleton method "foo" was undefined singleton method "bar" was undefined 若想对普通方法的未定义状态设定钩子时,请使用Module#method_undefined. |