Ruby attr\u reader、attr\u writer、attr\u accessor方法存在于哪里?它们是如何实施的?
我想知道哪里有三种方法Ruby attr\u reader、attr\u writer、attr\u accessor方法存在于哪里?它们是如何实施的?,ruby,Ruby,我想知道哪里有三种方法attr\u reader,attr\u writer,attr\u 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.pr
attr\u reader
,attr\u writer
,attr\u 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\u reader
。我也想知道它的实现提示。任何人请描述。它们在模块中实现。看
MRI在C语言中的实现例如用于attr\u 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;
}
静态值
rb_mod_attr_读取器(int argc,VALUE*argv,VALUE klass)
{
int i;
对于(i=0;i,它们在模块中实现。请参阅
MRI在C语言中的实现例如用于attr\u 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;
}
静态值
rb_mod_attr_读取器(int argc,VALUE*argv,VALUE klass)
{
int i;
对于(i=0;iattr\u reader
和attr\u writer
是在模块中实现的方法。这些方法为您创建一些其他方法。attr\u reader
方法创建一个getter方法,而attr\u writer
创建一个setter方法。attr\u accessor
方法称为attr\u reader
和属性写入器
attr\u reader
和attr\u 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
NB:I用我的访问器替换了attr\u访问器,用我的读卡器替换了attr\u读卡器,用我的写卡器替换了attr\u写卡器attr\u读卡器
和attr\u写卡器
是在模块
中实现的方法。这些方法为您创建了一些其他方法。attr\u读卡器
方法创建了一个getter方法,而 attr\u writer
创建一个setter方法。attr\u访问器
方法称为attr\u reader
和attr\u writer
attr\u reader
和attr\u 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
NB:我用我的\u访问器替换了attr\u访问器,用我的\u阅读器替换了attr\u阅读器,用我的\u书写器替换了attr\u书写器我想知道这些方法在ruby库中的实现,而不是ruby编译器源代码。@Farukhosen:这是ruby“库”(用于MRI)的实现。Ruby解释器(包括所有核心类)是用C实现的。不存在Ruby编译器。@Farukhosen该实现是用C代码实现的:我想知道这些方法在Ruby库中的实现,而不是Ruby编译器源代码。@Farukhosen:这是Ruby“库”(用于MRI)的实现。包含所有核心类的Ruby解释器都是用C实现的。没有Ruby编译器。@Farukhosen该实现是用C代码实现的:非常好。但您应该明确这与实际情况类似。行为上也存在差异,例如,您不能执行attr\u reader:'x y'
而my\r阅读者:'xy'
“工作”直到属性被访问。非常好。但你应该清楚这与实际情况类似。行为上也有差异,例如,你不能做attr\u reader:'xy'
,而my\u reader:'xy'
“工作”直到属性被访问。