Ruby如何使用符号来引用变量名?

Jor*_*les 4 ruby metaprogramming

当我们name在以下代码中定义getter和setter方法时:

class Animal
    attr_accessor :name
    def initialize(name)
        @name = name
    end
end
Run Code Online (Sandbox Code Playgroud)

内部发生了什么?Ruby如何获取符号并将其与变量匹配?

Ren*_*non 6

它使用instance_variable_getinstance_variable_set为此.

更新:正如安德鲁马歇尔所指出的那样,并非如此 大多数ruby核心方法都是用C定义的,但结果基本相同.

人们可以定义attr_accessor和朋友如下:

def self.attr_accessor(*names)
  names.each do |name|
    define_method(name) do
      instance_variable_get("@#{name}")
    end

    define_method("#{name}=") do |new_value|
      instance_variable_set("@#{name}", new_value)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,我在define_method这里也用来定义访问器方法.

我建议您看看有关ruby元编程的一些介绍性文本,例如"不知道Ruby中的元编程?" .