所有类的超类,它定义了对象的一般行为
包含的模块:
. 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)"拷贝.它们只拷贝对象本身,而不会拷贝对象的所指(例如数组的元素等).
另外,如果对拷贝进行如下测试的话
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
.
若两个对象相等则返回真.常用来判断Hash中的两个索引是否相同.
在对该方法进行再定义的同时,也必需对Object#hash方法进行再定义.
默认情况下,eql?
的定义与equal?
相同,即判断对象的同一性.
若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.
禁止修改对象的内容.返回self.
若强行修改则会引发TypeError异常.
frozen?
若某对象禁止修改其内容则返回真.
hash
返回对象的哈希表值.用来在Hash类中保存对象.
当A.eql?(B)
成立时,则A.hash == B.hash
也必须成立.若再定义eql?
时,也必须对该方法进行再定义.
默认情况下,它的返回值与Object#id的返回值相同.但是,只有Fixnum,Symbol和String使用内部哈希表函数(不可改变).
再定义hash时,将返回任意整数.
id((<obsolete>))_ _id_ _
object_id
返回与各个对象对应的唯一的整数.但是,为某对象分配整数的具体情形并不固定.
为了应对您对id
方法进行再定义,Ruby提供了别名__id__
,我们推荐您在库中使用后者.另外,请不要对__id__
进行再定义.
ruby 1.7 特性: 在1.7版本中,id已被停用.
inspect
将某对象转为人工可读的字符串并返回该字符串.
内部函数p就是使用该方法来表示某对象的.
instance_eval(expr, [fname, [lineo=l]])
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) # => nilinstance_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) # => 2instance_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.