从散列中获取一个键,并将其作为对象的getter进行插值

时间:2017-10-25 09:05:59

标签: ruby getter string-interpolation instance-methods string-to-symbol

我有一个创建对象的类。我为该类创建了getter / setter方法。

Class Test

  attr_accessor :method1, :method2, :method3, :method4

我已经从该类创建了几个实例,并将它们附加到列表

@object_array = [obj1, obj2, obj3]

我有一个包含键和值的字典。键具有与测试类中的实例变量使用的字符串值相同的字符串值。 (例如' method1'存在为:method1)我想将这些键作为getter方法访问。

@method_hash = {'method1' => ['data1','data2'], 'method2' => ['data3','data4']}

我希望这可行,但不是。我做错了什么?

我应该提到下面的方法是在一个类中进行的,而@object_list和@method_list本身就是这个第二类的实例变量。 (这可能与解决问题无关,但想提及以防万一..)

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让它无法运行。

1 个答案:

答案 0 :(得分:1)

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.

更新:优先o.public_send(key)优先send来动态调度可公开访问的方法/属性,因为它更安全地检查对象而不泄漏它的私有内容。

如果您确定这是一个实例变量,请使用更安全的第一个选项。