所有类的超类.它定义了对象的一般行为.
包含的模块:
* 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.
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.