zoukankan      html  css  js  c++  java
  • ruby-attr_accessor使用

    ruby语法-attr_accessor方法使用

    本文主要讲解下ruby下attr_accessor方法的使用。

    示例1:

    class Person
    end
    
    person = Person.new
    person.name # => no method error
    

    显然,我们Person类里没有定义name的方法,执行报错。

    示例2:

    class Person
      def name
        @name # simply returning an instance variable @name
      end
    end
    
    person = Person.new
    person.name # => nil
    person.name = "Dennis" # => no method error
    

    其中,"person.name"是调用的读方法(reader),"person.name = "Dennis""调用的是写方法(writer)。
    虽然我们创建了name的函数,但是我们仍然不能给name变量赋值。那么我们怎么才能使用writer方法呢,请看接下来的例子。

    示例3

    class Person
      def name
        @name
      end
    
      def name=(str)
        @name = str
      end
    end
    
    person = Person.new
    person.name = 'Dennis'
    person.name # => "Dennis"
    

    在这个实例中,我们实现了对@name变量的读和写。
    但是,如果这样写是不是太麻烦了? 有没有简单的方式实现相同的功能呢?

    示例4

    class Person
      attr_reader :name
      attr_writer :name
    end
    

    attr_xxx方法出现了,这两个方法和示例3效果相同。想看更简单的方式?接着来

    示例5

    class Person
      attr_accessor :name
    
      def greeting
        "Hello #{@name}"
      end
    end
    
    person = Person.new
    person.name = "Dennis"
    person.greeting # => "Hello Dennis"
    

    "attr_accessor :name"方法包含了attr_reader和attr_reader方法,实现了对实例变量@name的writter和reader。

    总结:

    attr_accessor方法包含了attr_reader和attr_reader方法,当使用attr_accessor方法时,可以通过类实例对指定的变量赋值和读操作。
    

    一个小问题?

    为什么不直接用"attr_accessor @name"这种形式呢?为什么非要用":"符号去做声明?
    
        要理解attr_accessor是一个方法调用,":name"是这个方法的一个参数,":"不是特殊的语法。
    
        如果你使用"attr_accessor @name"的形式,那么会被ruby解析为"attr_accessor nil",是不能通过类实例给name赋值的,会产生报错信息"`attr_accessor': nil is not a symbol nor a string (TypeError)"
  • 相关阅读:
    【uni-app】预览图片(单/多张)
    【uni-app】全局数据globalData的设置、获取、修改
    C# DataGridView删除指定行
    设置DataGridview行的字体颜色
    设置DataGridView的单元格颜色
    JAVA设计模式总结之23种设计模式
    为什么要用k8s(优缺点)
    @RequestMapping中Get&Post 不写默认为都支持
    查询某条记录在mysql中的行数
    如何屏蔽博客园新出的标题栏?一行代码屏蔽博客园冒出的标题栏!
  • 原文地址:https://www.cnblogs.com/mauricewei/p/8603547.html
Copyright © 2011-2022 走看看