类定义
在类或模块定义时,其自身充当了当前对象self的角色,类和模块也都是对象,与方法和块相同,类定义也会返回最后一条语句的值.
class MyClass
puts "Hello"
end
=> Hello
当前类
尽管self可以获得当前对象,但并不能获得当前类,每当通过class关键字打开一个类时,这个类就成为当前类.
class MyClass
# 现在当前类是MyClass
def my_method
# my_method是MyClass的一个实例方法
end
end
class关键字必须指定类名才可以打开类,对于未知类名就可以修改当前类,可以使用class_eval().
class_eval()
Module#class_eval()方法会在一个已存在类的上下文中执行一个块.
def add_method_to(a_class)
a_class.class_eval do
def my_method do
"Hello!"
end
end
end
add_method_to String
"str".my_method # => "Hello!"
class_eval()方法与instance_eval()方法并不相同, instance_eval()方法仅会修改self(特定情况下也会修改当前类),而\calss_eval()方法会同时修改self和当前类.
对于二者的选择,若只想打开一个对象,并不在乎是不是类,使用instance_eval更好;而若是希望打开类,则使用class_eval()更好.
类实例变量
由于类是Class的实例,类名是常量,故而当self由当前类充当时所定义的变量即为类实例变量.
<