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如何获取符号并将其与变量匹配?
它使用instance_variable_get并instance_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中的元编程?" .