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这种带@@的是类变量,这个很特殊,它被所有对象都共享,所以它存在于类中,而且必须要初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值