本次学习资料
通读《Ruby元编程》,记录下有趣的以及不明白的知识点
当前类
当前类和当前对象都是一直存在的,当前对象可以用self调用,但是没有方法能获取当前类。定义一个方法,那个方法将成为当前类的一个实例方法。
一般情况下,当前对象的类就是当前类。
比如,在程序的顶层,当前对象是main,main的类就是Object,也就是当前类。在一个方法中,当前类就是当前对象的类。
class_eval方法
会在一个已存在类的上下文中执行一个块。
class_eval方法会同时修改self和当前类。
def test_class_eval(a_class)
a_class.class_eval do
def test; puts 'test'; end;
end
end
test_class_eval(String)
"abc".test
#=>test
相比于class_eval,instance_eval方法只修改当前对象,当只想修改self的时候,用instance_eval,若想打开类,用class_eval。
class_exec能接受额外的代码块作为参数。
类实例变量和类变量
下面的例子中,有两个不同作用域的my_var,要注意区分,一个是类作为对象的实例变量,一个是类的实例变量,要牢记类也是对象
class MyClass
@my_var = 1
def self.read
@my_var
end
def write(my_var)
@my_var = my_var
end
def read
@my_var
end
end
puts MyClass.read
my_class = MyClass.new
puts my_class.read.inspect
my_class.write(2)
puts my_class.read
#=>1
<