我想知道存在三种方法attr_reader
,attr_writer
,attr_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
。我想知道它的实现提示。有人请描述。
答案 0 :(得分:3)
attr_reader
和attr_writer
是Module
中实施的方法。这些方法为您创建了一些其他方法。 attr_reader
方法创建一个getter方法,而attr_writer
创建一个setter方法。名为attr_accessor
和attr_reader
attr_writer
方法
attr_reader
和attr_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;
}
由于Class
是Module
的子项,因此它们在每个类定义中都可用。