从哈希中获取一个键,并将其作为 getter 插入到一个对象上
Taking a key from a hash, and interpolate that as a getter on an object
我有一个 class 可以创建对象。我已经为 class.
创建了 getter/setter 方法
Class Test
attr_accessor :method1, :method2, :method3, :method4
我已经从那个 class 创建了几个实例,并将它们附加到列表中
@object_array = [obj1, obj2, obj3]
我有一本包含键和值的字典。这些键与测试 class 中的实例变量使用的字符串值相同。 (例如 'method1' 作为 :method1 存在)我想访问这些键作为 getter 方法。
@method_hash = {'method1' => ['data1','data2'], 'method2' => ['data3','data4']}
我希望这能奏效,但事实并非如此。我做错了什么?
我应该提到下面的方法是在 class 中进行的,@object_list 和 @method_list 本身就是第二个 class 的实例变量。 (这可能与解决问题无关,但想提一下以防万一..)
block (2 levels) in func1': undefined method `key' for #<Obj:0x007ffbe1061870> (NoMethodError)
def func1
@object_array.each do |o|
@method_hash.each do |key, value|
puts o."#{key}"
end
end
end
我尝试使用 .to_s、.to_sym 来让它工作,但没有成功。
puts o."#{key}"
在语法上是错误的。您需要在运行时获取 属性。为此,您可以:
puts o.instance_variable_get("@#{key}") # dynamically inspect instance variable
# above will only work if key is instance variable and not a method of o.
或
puts o.send(key) #dyanmic dispatch
# will work as long o responds to the key like o.method1.
更新: 比 send
更喜欢 o.public_send(key)
以仅动态调度可公开访问的 method/attribute,因为它更安全地检查对象而无需泄露它的私人内容。
如果您确定这是一个实例变量,请选择更安全的第一个选项。
我有一个 class 可以创建对象。我已经为 class.
创建了 getter/setter 方法Class Test
attr_accessor :method1, :method2, :method3, :method4
我已经从那个 class 创建了几个实例,并将它们附加到列表中
@object_array = [obj1, obj2, obj3]
我有一本包含键和值的字典。这些键与测试 class 中的实例变量使用的字符串值相同。 (例如 'method1' 作为 :method1 存在)我想访问这些键作为 getter 方法。
@method_hash = {'method1' => ['data1','data2'], 'method2' => ['data3','data4']}
我希望这能奏效,但事实并非如此。我做错了什么?
我应该提到下面的方法是在 class 中进行的,@object_list 和 @method_list 本身就是第二个 class 的实例变量。 (这可能与解决问题无关,但想提一下以防万一..)
block (2 levels) in func1': undefined method `key' for #<Obj:0x007ffbe1061870> (NoMethodError)
def func1
@object_array.each do |o|
@method_hash.each do |key, value|
puts o."#{key}"
end
end
end
我尝试使用 .to_s、.to_sym 来让它工作,但没有成功。
puts o."#{key}"
在语法上是错误的。您需要在运行时获取 属性。为此,您可以:
puts o.instance_variable_get("@#{key}") # dynamically inspect instance variable
# above will only work if key is instance variable and not a method of o.
或
puts o.send(key) #dyanmic dispatch
# will work as long o responds to the key like o.method1.
更新: 比 send
更喜欢 o.public_send(key)
以仅动态调度可公开访问的 method/attribute,因为它更安全地检查对象而无需泄露它的私人内容。
如果您确定这是一个实例变量,请选择更安全的第一个选项。