`

ruby之attr_reader,attr_writer,attr_accessor

    博客分类:
  • ruby
阅读更多
attr_accessor用于创建读取和设置实例变量的方法,例如attr_accessor :price,则相当于创建price方法用于读取@price的值,创建price=(yourprice)方法用于将@price的值设置为yourprice
attr_reader则只创建读取实例变量的方法
attr_writer只创建为实例变量赋值的方法
请看下面的例子详解:
例1
class Person
end

person = Person.new
person.name # 此处报错,提示no method errorObviously we never defined method name. Let's do that.

例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 errorAha, we can read the name, but that doesn't mean we can assign the name. Those are two different methods. Former called reader and latter called writer. We didn't create the writer yet so let's do that.

例3
class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # 返回值为 "Dennis"

ruby提供了attr_accessor、attr_reader、attr_writer来让程序员免去编写上面类似代码的重复性工作。
例4
class Person
  attr_reader :name
  attr_writer :name
end

person = Person.new
person.name = "Dennis"
person.name # 返回值为"Dennis"

例5
class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting  # 打印"Hello Dennis"
现在明白了attr的三个类型的用法了吧!
分享到:
评论

相关推荐

    程序员需要经常刷题吗-scoped_attr_accessor:将私有和受保护的attr_accessor方法添加到您的类-或所有ruby

    需要程序员经常刷题吗范围属性访问器 将范围访问器添加到 ruby​​。 您可以在私有或受保护范围内创建作者、读者和访问...protected_attr_reader :some_weird_counter end class Monkey < Primate # Monkey can def

    weak_attr_accessor:RubyMotion 的weak_attr_accessor

    #weak_attr_accessor 用于 用法 做这个: class MainView < UIView weak_attr_accessor :view_controller end 而不是这个: class MainView < UIView def view_controller @view_controller end def...

    attr_extras:使用attr_initialize之类的方法从Ruby中获取一些样板

    提供像attr_private和attr_value这样的底层方法,可以很好地补充Ruby的内置attr_accessor , attr_reader和attr_writer 。 像pattr_initialize (或attr_private_initialize )和method_object这样的更高级别的...

    attr_encrypted:生成用于加密和解密属性的attr_accessor

    安装将attr_encrypted添加到您的gemfile中: gem "attr_encrypted" , "~> 3.1.0" 然后安装gem: bundle install用法如果您正在使用ActiveRecord , DataMapper或Sequel类的ORM,则使用attr_encrypted很容易: class ...

    attr_typecastable:具有类型转换功能的 attr_accessor

    attr_typecastable attr_accessor 具有类型转换功能。要求Ruby 2.0 或更高版本安装将此行添加到应用程序的 Gemfile 中: gem 'attr_typecastable' 然后执行: $ bundle或者自己安装: $ gem install attr_...

    ruby_1_9_3_core_rdocs

    `和`Module#attr_accessor`等方法。 8. **异常处理**:新增了`rescue`子句的多重匹配,使得异常处理更加灵活。 9. **Proc对象**:Proc对象现在可以作为块传递,并且支持`lambda`和`proc`两种不同的行为,`lambda`...

    sith:带有Ruby样板符号的Ruby宏预处理器

    西斯sith是Ruby的宏预处理器 仍然是原型。...* labels ) attr_reader ~ { labels } attr_writer ~ { labels }end Ruby文件 class A attr_accessor a, zendsith ruby_file.rb macro_definitions.rb > output

    Ruby-FastAttributes将属性与类型添加到类中

    在Ruby中,通常我们使用`attr_accessor`、`attr_reader`或`attr_writer`来定义类的属性。例如: ```ruby class Example attr_accessor :name end example = Example.new example.name = "John Doe" puts example....

    prototype_oop_javascript_ruby_prototype_

    attr_accessor :name end Person.include(Sayable) person1 = Person.new person1.name = 'Alice' person1.say_hello # 输出 "Hello, Alice" ``` 尽管JavaScript和Ruby在实现OOP上有显著的区别,但它们都允许...

    attr_setting:增强的 attr_accessor

    attr_accessor :send_email def initialize @send_email = true end def send_email? send_email end end 该类定义了一个Configuration对象,其中包含应用程序是否应该发送电子邮件的设置。 send_email设置...

    ruby-oo-fundamentals-attribute-accessors-lab-sea01-seng-ft-07132

    在Ruby中,属性访问器是通过`attr_accessor`、`attr_reader`和`attr_writer`这三个内置宏来创建的。`attr_accessor`用于同时创建读取(getter)和写入(setter)方法,`attr_reader`只创建getter,`attr_writer`则只...

    oop-basics-accessor-methods

    在 Ruby 中,我们可以使用 `attr_accessor`、`attr_reader` 和 `attr_writer` 这三个内置宏来轻松定义这些方法。它们极大地提高了代码的可读性和简洁性。 1. **attr_accessor**:这个宏同时创建了 getter 和 setter...

    MetaProgramming-Play:重写 Ruby 注入方法以了解元编程

    使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码片段: 使用define_method attr_accessor方法 def self . attr_accessor? ( attr ) read_method = " #{ attr } ?" write_method = " #{ attr } =...

    Ruby 面向对象知识总结

    - **`attr_reader`**:仅提供访问器的方法。 ```ruby class Box attr_reader :width, :height def initialize(width, height) @width = width @height = height end end ``` - **`attr_writer`**:仅...

    ruby-oo-self-person-lab

    获得辨别何时实现attr_accessor , attr_reader和attr_writer 。 能够识别何时定义自己的attr_reader (getter)和attr_writer (setter)方法。 介绍 为了练习面向对象的编程(OOP),您将创建一个Person类。 ...

    Ruby元编程第二版中文

    `attr_accessor`、`attr_reader`和`attr_writer`是用于快速创建属性的元编程工具。符号(Symbol)在Ruby中是特殊的,它们在内存中只存在一份,常用于元编程中的键值。 5. **Proc对象与lambda**:Ruby的`Proc`和`...

    ruby-oo-fundamentals-attribute-accessors-lab-wdc01-seng-ft-06012

    4. **只读属性(Read-only Attributes)**: 如果只想提供getter方法,可以使用`attr_reader`。这禁止了外部代码直接修改属性的值,确保数据的完整性。 5. **只写属性(Write-only Attributes)**: 同样,如果只需要...

    attr_validator:对象验证库

    gem 的主要思想是将所有对象验证逻辑与对象本身分离用法假设您有以下类,并且您想验证此类的对象 class Contact attr_accessor :first_name , :last_name , :position , :age , :type , :email , :color , :status ...

    Ruby从入门到精通pdf

    - 属性与方法:通过attr_accessor、attr_reader和attr_writer定义属性,方法可以动态添加和删除。 - 构造器:Ruby中的构造器通常是initialize方法,用于初始化新对象。 3. **块与闭包**: - 块:Ruby中的代码块...

    Ruby 代码规范

    - 使用 `attr_accessor`, `attr_reader`, `attr_writer` 来声明属性,而不是手动创建getter和setter。 - 避免在类的初始化方法之外定义实例变量,使用 `attr_accessor` 或 `initialize` 方法初始化。 6. **错误...

Global site tag (gtag.js) - Google Analytics