Ruby类名

一、类名为什么是常量?

#当前类是Object
self.class
#=>Object
#添加一个类C
class C ; end
Object.constants.grep  /^C$/ 
#=>[:C]      
#这时在当前类Object中添加了常量 :C
#:所以类名是常量。


二、这里的类名常量C,为什么是所有作用域可见?

类名常量C添加在Object类中
Object是所有类的superclass(BasicObject除外),所以在所有类中都可见。

如果:

module M 
  class C; end
end
Object.constants.grep  /^M$/ 
#=>[:M]
Object.constants.grep  /^C$/ 
#=>[]
M.constants
#=>[:C]

#---------关于 Kernel#load 方法的实验----------
#person.rb
#class Person; end

class C
  class D
    def self.init
      load './person.rb'     
     end
     init              #load到Object,而不是C::D
  end
end
Object.constants.grep /^C$|^Person$/
#=>[:C,:Person]
Object.constants.grep /^D$/
#=>[]
C.constants
#=>[:D]



三、类名常量C和类C的关系

#类名常量C是指向(reference)类C的对象

class C
  def hi
    p 'hi, in class C'
  end
end
#变量cc
cc = C           
cc.name
#=>"C"
cc.new.hi
#=> 'hi, in class C'         

#改变常量C,(实验需要,平时不建议改变常量^_^)
C = "i'm string now"   #assign
#=>warning.....        
#C还是常量
Object.constants.grep  /^C$/
#=>[:C]  
C
#=>"i'm string now"
#指向了String类的对象。

#变量cc没变,指向类C
cc.name
#=>"C"
cc.new.hi        
#=> 'hi, in class C'

#D是常量
D = cc         
Object.constants.grep  /^C$|^D$/
#=>[:C,:D]
D.name
#=>"C"
#常量D指向类C

#打开类C,添加方法sing
class D       # D是指向类C的常量!!!
  def sing
    'singing'
  end
end
#常量D和变量cc共同指向C类
D.instance_methods(false)  
cc.instance_methods(false)
#=>[:hi,:sing] 

#通过变量cc,向类C 添加方法
cc.send(:define_method, :dance){"dance"}  
cc.instance_methods(false)
D.instance_methods(false)
#=>[:hi,:sing,:dance]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值