Ruby创建对象以及类和对象之间交互

一、从类中创建对象
      类Class定义的实例方法Class#new将创建接受者对应的类的对象。这个是通过调用classexpr.allocate来完成的。可以重载 这个方法,但是必须返回正确的类的对象。然后调用新创建的对象的initialize,并将传递给new的参数传递给initialize。
    注意:
     1、如果类定义中重载了类方法new,并且new没有调用super,那么将无法创建该类的对象,并调用new将返回nil
     2、通常initialize应当调用super,用于对父类进行初始化。
  二、类和对象之间的交互
     1、简单对象
       如图:


       其中klass用于指向对象的类引用,用于指向class对象的。super是用于指向父类。
     2、类对象
        在类定义中我们提到了,类定义是一段可执行的代码,并且是在某个对象作为上下文中执行,这样每个类本身就是一个对象。下图中展示了类和对象的全局图。每个类对象的klass都会隐含的指向一个虚拟类metaclass,所有类定义的类方法都是放到这个metaclass中的,当方法的接受者是类对象时,ruby就会直接到该metaclass中查找相应 的方法。可以这样理解,metaclass就是类对象的类。

        既然类是对象,那么类对象就可以有自己的实例变量和实例方法。

  • 实例方法

           类对象的实例方法,即,类定义中的类方法定义

 

  1. class Test   
  2.    def Test.to_s   
  3.       puts 'This is class method'   
  4.    end  
  5. end  

      等价:

ruby 代码
  1. class Test         
  2.         
  3.   class << self         
  4.      def to_s         
  5.             
  6.         .......         
  7.      end         
  8.   end         
  9. end        
  • 实例变量

           类实例变量是定义在metaclass中的变量。所以,必须在metaclass中定义访问函数。可以通过以下几种方式定义

ruby 代码
  1.   
  2. class Test                                              class Test   
  3. @a='ffd'                                                 @a='ffd'   
  4. end                                                      class <<self  
  5.                                                          attr_reader:a  
  6. class <class << Test       <=>             
  7.                                                          end  
  8.  def a()                                                end            
  9.  @a                    <=>     attr_reader:a  
  10.  end  
  11. end                            end  
  12.   
  13. print Test.a => ffd  

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值