Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby attr\u reader、attr\u writer、attr\u accessor方法存在于哪里?它们是如何实施的?_Ruby - Fatal编程技术网

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;i
attr\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'
“工作”直到属性被访问。