attr_reader,attr_writer,attr_accessor方法在哪里存在?他们是如何实施的?

时间:2015-11-17 09:13:06

标签: ruby

我想知道存在三种方法attr_readerattr_writerattr_accessor的位置。这里,

class Book
  attr_reader :title, :price
  def initialize(title, price)
    @title = title
    @price = price
  end
end

book1 = Book.new("Ruby essentials", 100)
puts book1.title
puts book1.price

我打电话给attr_reader。我想知道它的实现提示。有人请描述。

2 个答案:

答案 0 :(得分:3)

attr_readerattr_writerModule中实施的方法。这些方法为您创建了一些其他方法。 attr_reader方法创建一个getter方法,而attr_writer创建一个setter方法。名为attr_accessorattr_reader

attr_writer方法

attr_readerattr_writer都接受多个参数。

实施就像那样

class Module
    def my_accessor(*args)
        my_reader(*args)
        my_writer(*args)
    end
    def my_reader(*args)
        args.each do |method_name| 
            inst_variable_name = "@#{method_name}".to_sym
            define_method method_name do
                instance_variable_get inst_variable_name
            end
        end
    end

    def my_writer(*args)
        args.each do |method_name|
            inst_variable_name = "@#{method_name}".to_sym
            define_method "#{method_name}=" do |new_value|
                instance_variable_set inst_variable_name, new_value
            end
        end
    end
end
class TestMyAccessor 
     my_writer :a, :b, :c
     my_reader :a, :b, :c
    # my_accessor :a, :b, :c
end

o = TestMyAccessor.new 
puts o.a # nil
puts o.b # nil
puts o.c # nil
o.a = 2 

o.b = 3
o.c = "hello world"

puts o.a # 2
puts o.b # 3
puts o.c # hello world

注意:我用my_accessor替换了attr_accessor,用my_reader替换了attr_reader,用my_writer替换了attr_writer

答案 1 :(得分:2)

它们在Module中实施。请参阅ruby-doc.org

MRI在C中的实现是例如attr_reader

static VALUE
rb_mod_attr_reader(int argc, VALUE *argv, VALUE klass)
{
    int i;

    for (i=0; i<argc; i++) {
        rb_attr(klass, id_for_attr(argv[i]), TRUE, FALSE, TRUE);
    }
    return Qnil;
}

由于ClassModule的子项,因此它们在每个类定义中都可用。