现在的位置: 首页 > 综合 > 正文

Ruby 类的属性、变量、常量和方法定义

2018年04月18日 ⁄ 综合 ⁄ 共 2462字 ⁄ 字号 评论关闭

一、类属性声明
    一个对象的外部可见部分被称其为属性。ruby通过对象的实例变量来表示对象的内部状态,即,属性。既然是对外部可见的。Ruby中,实例变量无法直接为对象外使用,只能通过对象定义的操作方法访问。同理,实例变量也不能变成public变量,同样是通过方法访问
    那就是可以通过某种方式读取和修改的。Ruby中是通过定义方法来访问属性。有两种方法方式:
    1、直接定义类属性的方法
  

ruby 代码
  1.     
  2. #这个就是定义一个对象的实例变量name,作为Test的属性     
  3. class Test     
  4.    def initialize(name)     
  5.      @name=name     
  6.     end    
  7.   def name     
  8.    @name    
  9. end    
  10.   def name=(att)  
  11.   @name=att  
  12. end 
  13. end    

      这里为属性name对外提供了读取和删除的方法
   
    2、通过Module的方法定义
       该声明不是Ruby语法的一部分,它不过是定义在类Module的方法,该方法会自动创建访问类属性的方法

ruby 代码
  1. class name      
  2.    attr: attribute[,writable]      
  3.          
  4.     attr_reader :attribute[,attribute,......]      
  5.           
  6.     attr_wirter :attribute[,attribute,......]      
  7.      
  8.    attr_accessor :attribute[,attribute,......]      
  9.      
  10. end     

    attr :直接定义属性,默认的只读,如果后面跟true,表示属性可写,false为只读

ruby 代码
  1. class Test  
  2.   attr :foo, true 
  3.   attr :read 
  4. end 
  5. c = Test.new 
  6. c.foo = 5   # 变成 c.foo=( 5 )  
  7. p c.foo     # => 5  
  8.  
  9. c.read='ok' #将会报错,因为read属性是只读
     
  10.  

      

   attr_reader: 表示该方法只读,该方法自动创建如下方法:

ruby 代码
  1. class name  
  2.  
  3.      def attribute  
  4.       
  5.          attribute  
  6.     end 
  7. end 

      attr_writer:表示属性只写。它只创建修改属性的方法。不能从外部访问该属性该方法自动创建如下方法:

ruby 代码
  1. class name         
  2.            
  3.    def attribute=(att)      
  4.         attribute=att       
  5.    end     
  6. end        

  

ruby 代码
  1. class name         
  2.         
  3.      def attribute         
  4.              
  5.          attribute         
  6.     end        
  7.      
  8.    def attribute=(att)      
  9.         attribute=att       
  10.    end     
  11. end        

二、实例变量,类变量
    1、实例变量
      Ruby规定实例变量是以@开头,后跟一个名字。对实例变量的访问注意
        a、在类内部可以对其赋值和读取没有限制
        b、类外不能直接访问对象的实例变量,只能通过方法访问。正如上面所说的属性访问方式一样。
        c、实例变量在使用前不用必须初始化。
    2、类变量
      
       Ruby规定类变量是以两个@@开头,后跟一个名字。对于一个给定的类而言,类变量只存在一份拷贝。
       注意:
         1、类变量必须在使用之前要初始化。
         2、类变量是私有的。要想能从类外部访问,必须定义方法访问。这个方法是一个实例方法,要么是一个类方法。
         3、通常类变量属于包含该变量的最内层的类或模块。但是,可以为被定义该变量的类的所有子类所共享
  三、类常量
     Ruby 的常量也是对对象的引用,常量通常在第一次被赋值的时候创建(通常是在类或模块中定义)。和其他语言不一样,
     Ruby允许改变常量的值,因为常量是对对象的引用,通过改变常量的值,可以改变它所引用的对象的内部状态。
     1、在类或模块中的任何位置都可以直接访问该类或模块中定义的常量。
     2、在类或模块外,可以通过在域作用符::前加上一个返回适当类或模块对象的表达式来访问。
     3、对于不属于任何类或模块的常量,可以直接访问或使用不带前缀的域作用符来访问
     4、通过在常量名之前使用类或模块名和域作用符,还可以将常量从外面添加到已存在的类或模块中。
     注意:
     1、类名本身就是常量。这就意味着可以把类和其他Ruby对象一样对待:可以拷贝它们;将它们作为参数传入方法;或者在表达式中使用它们
     2、如果一个无名的类赋值给了一个常量。Ruby将常量作为类名。

attr_accessor: 该方法自动创建两个方法,一个用于读取属性值,一个用于修改属性值四、方法
     1、实例方法
       实例方法的定义就是通常的方法定义。其作用域就是每个特定的对象。用于访问该对象的内部状态和行为。
       实例方法的定义是保存在对象所属类对象的定义中。如果没有,就到类对象的父类对象中查找。依次类推
     2、类方法
       在方法名前放置类名以及一个点,来定义类方法
        def classname.methodname
        .....
        end
        类方法的定义是保存在类对象的虚拟类中。当调用类方法时,是到虚拟的类中寻找。如果没有,就到虚拟类的父类中查找。依次类推。   

抱歉!评论已关闭.