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这种带@@的是类变量,这个很特殊,它被所有对象都共享,所以它存在于类中,而且必须要初始化。