ruby元编程之大话 对象模型

class A
    @@var=1
    @class_var="class var"
    attr_accessor :object_var,:object_var2
    class << self
        attr_accessor :class_var
        def a_method1
            
        end
    end

    def  A.a_method2
    end

    def self.a_method3
    end

    def ask
        @object_var="object var"
    end
end

a=A.new

def a.ask1
end



与类相关的无非是对象,类本身,对象实例变量,类本身实例变量,类变量,对象的实例方法,类的实例方法(类方法)

先说各种变量:
a=A.new
p a.instance_variables #对象的实例变量
a.ask
p a.object_var2=2
p a.instance_variables #对象的实例变量

p A.instance_variables #类的实例变量

打印信息:
[ ]
2
[:@object_var, :@object_var2]
[:@class_var]

[ ] 很显眼,ruby和其他语言不同,他的变量属于对象本身,也就是说,@object_var存在于方法ask内,如果这个方法不调用,那么a对象是不会有实例变量的,而且如果调用方法,方法内的实例变量是nil,退出方法的时候,因为是空指针引用,也会被GC回收掉,所以也是[ ]。
这里类的实例变量没有调用为什么也会显示出来,是因为ruby的class A end 这个作用域内的代码是会被执行的,所以A是有实例变量的。

对象的实例变量是存在于对象本身之中的,这里的对象可以是a,可以是A,可以是任何,因为ruby一切都是对象。


方法:
p a.methods.grep(/ask/)
p a.class.instance_methods.grep(/ask/)
p A.methods.grep(/a_method/)
p A.class.instance_methods.grep(/a_method/)

打印:
[:ask1, :ask]
[:ask]
[:a_method1, :a_method2, :a_method3]
[]


说明:对于单件方法是存在于单件类中的,而对于实例方法是存在于所在的类中的,只有这样才可以实现,对于特定的对象的方法,只能特定对象能访问,对于实例方法,所有对象都可以方法。

下面重点说下attr_accessor 存在哪里:
p A.class.instance_methods(false).grep(/^class_var=?$/) #不打印祖先的方法
p A.methods.grep(/^class_var=?$/)


p a.class.instance_methods(false).grep(/^object_var=?$/) #不打印祖先的方法
p a.methods.grep(/^object_var=?$/)

打印:
[]
[:class_var, :class_var=]
[:object_var, :object_var=]
[:object_var, :object_var=]

从上面结果可知,对于类的attr_accessor 是存在于类的单件类中的,对象的attr_accessor是存在于对象所在类的。对于单件类,object对象必须要存在单件方法才会生成单件类,而类的单件类是一开始就存在了。



类变量:
@@var这种带@@的是类变量,这个很特殊,它被所有对象都共享,所以它存在于类中,而且必须要初始化。

你可能感兴趣的:(object,Ruby)