我可以在Ruby中用字符串引用对象的属性吗?

时间:2014-06-10 23:51:54

标签: ruby string symbols

如果我有一个名为Node的ruby类:

class Node
  attr_accessor :a, :b, :c
  attr_reader :key
  def initialize(key)
    @key = key
  end
  def [](letter)
    if letter == 'a'
      return self.a
    elsif letter == 'b'
      return self.b
    elsif letter == 'c'
      return self.c
    end
  end
end

如何优化def [](letter)以便我不会重复代码?更具体地说,如何使用相应的字符串访问对象的属性(即红宝石符号:a:b:c)?

1 个答案:

答案 0 :(得分:2)

您可以使用send,它会在调用方上动态调用方法,在本例中为self

class Node
  def [](key)
    key = key.to_sym
    send(key) if respond_to?(key)
  end
end

请注意,我们在调用之前检查self是否具有适当的方法。这样可以避免获得NoMethodError而导致node_instance[:banana]返回nil,这在接口处是合适的。

顺便说一句,如果这是Node类的大多数行为,您可能只想使用OpenStruct:

require 'ostruct'
node_instance = OpenStruct.new(a: 'Apple', b: 'Banana')
node_instance.a    #=> 'Apple'
node_instance['b'] #=> 'Banana'
node_instance.c = 'Chocolate'
node_instance[:c]  #=> 'Chocolate'