【发布时间】:2012-07-28 22:53:31
【问题描述】:
我是 Ruby 新手,对如何在 Class 中创建类似于 :attr_accessor 的方法感到困惑,因为它将方法添加到用户类,但是这些添加的方法可以访问预初始化的实例变量。我很难解释,所以这里是我努力的一个大大简化的示例:
class Class
def super_accessor_wow(attr_name)
attr_name = attr_name.to_s
new_var_name = "@crazy_var_name"
instance_variable_set(new_var_name, ["hi", "everyone"])
module_eval(%Q/
def super_#{attr_name}()
return @#{attr_name}
end
def super_#{attr_name}=(value)
@#{attr_name} = value
end
def greetings
return #{new_var_name}
end
/)
end
end
这就是我尝试使用Class 上的新方法来修改我自己的类的方式:
class Foo
super_accessor_wow(:bar)
end
foo1 = Foo.new()
foo1.super_bar = 1000
puts foo1.super_bar
puts foo1.greetings.inspect
第一个 puts 打印 '1000'
第二个puts打印'nil',所以我的instance_variable_set调用super_accessor_wow似乎没有效果。
顺便说一下,我预计第二个 puts 会打印 '['hi', 'everyone']'。所有这些代码都包含在一个 Ruby 文件中。
【问题讨论】:
-
我认为您正在寻找 instance_variable_set(new_var_name.to_sym, ["hi, "everyone"]) 因为 instance_variable_set 需要一个符号,而不是字符串。不幸的是,这并不能解决问题。
标签: ruby metaprogramming