`

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_...

    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

    attr_setting:增强的 attr_accessor

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

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

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

    ruby-oo-self-person-lab

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

    attr_validator:对象验证库

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

    instance:光滑的对象实例 API

    实例它是什么? Instance 是一种方便且安全的API,用于访问和操作对象的状态。它是如何工作的... class Song attr_accessor :title attr_accessor :artist attr_accessor :year def initialize ( title , artist

    attr-filters:筛选对象属性的宝石

    AttrFilters 轻量级的gem,用于以零依赖关系过滤PORO(普通的旧式Ruby对象)属性。... attr_accessor :email , :first_name , :last_name , :zip , :birth_date , :due_date filters :email , trim : true , down

    ruby-oo-object-relationships-my-pets

    请记住,某些属性应该是可读可写(即attr_accessor S),而另一些可能需要只是制定者( attr_writer )或只是吸气剂( attr_reader )。 测试套件将明确这一点,因此请注意测试输出。 第二部分:对象关系 主人应该...

    oo-my-pets-v-000

    请记住,某些属性应该是可读可写(即attr_accessor S),而另一些可能需要只是制定者( attr_writer )或只是吸气剂( attr_reader )。 测试套件会清楚说明这一点,因此请注意测试输出。 第二部分:对象关系 主人...

    oo-my-pets-online-web-sp-000

    请记住,某些属性应该是可读可写(即attr_accessor S),而另一些可能需要只是制定者( attr_writer )或只是吸气剂( attr_reader )。测试套件将明确这一点,因此请注意测试输出。第二部分:对象关系主人应该能够...

    动态Orms-Readme-V-000

    动态ORM目标解释为什么动态ORM对... 我们可以通过使用类来创建数据库表来实现此映射: class Song attr_accessor :name , :album attr_reader :id def initialize ( id = nil , name , album ) @id = id @name = name

    dynamic-orms-readme-online-web-sp-000

    动态ORM 目标 解释为什么动态ORM对我们作为开发人员有用 建立基本的动态ORM 构建一个动态ORM,任何给定的Ruby类都可以... attr_reader :id def initialize ( id = nil , name , album ) @id = id @name = name @al

    boolize_attr

    attr_accessor :is_running end # Controller class JobsController def new @job = Job . new end def create @job = Job . new ( params [ :job ] ) p @job . is_running # returns String which '1' or '0...

    Ruby中使用设计模式中的简单工厂模式和工厂方法模式

    之前有看过《ruby设计... attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end def result 0 end end #加法类 class Operatio

    esotericpig:我的个人回购

    attr_accessor? :winning :diamond_suit: -- :check_mark: 正确执行initialize_copy :hot_beverage: -- :check_mark: Java utils( Robot包装器) :diamond_suit: -- :check_mark: 为YAML添加样式 :...

Global site tag (gtag.js) - Google Analytics