将对象的多个属性收集到数组中

时间:2015-07-05 12:12:53

标签: arrays ruby object properties

想象一下,我有一个example对象,其中包含以下属性:alphabetacharliedeltaecho,{{1 },foxtrotgamma

我想将其中一些属性的值收集到数组中。

我能做到:

hotel

但有没有办法避免重复该对象?

如果它是我可以做的单一财产:

properties = [example.beta, example.delta, example.gamma, example.hotel]

所以我正在寻找相当于此的东西(它不起作用):

properties = example.map(&:beta)

3 个答案:

答案 0 :(得分:2)

使用Object#send

properties = [:alpha, :beta, :charlie, :delta, :echo].map { |sym| example.send sym }

<强>更新

根据JörgWMittag的评论,也可以:

properties = [:alpha, :beta, :charlie, :delta, :echo].map(&example.method(:send))

答案 1 :(得分:1)

如果这是您想要的界面:

properties = example.map(:beta, :delta, :gamma, :hotel)

然后我认为这样做:

module AttrCollector
  def attr_values(*attr_names)
    attr_names.map do |attr_name|
      respond_to?(attr_name) ? send(attr_name) : nil
    end
  end
end

class Example
  attr_accessor :a, :b, :c
  include AttrCollector

  def initialize
    @a,@b,@c = 1,2,3
  end
end

example = Example.new
p example.attr_values(:a, :b, :c)
# => [1,2,3]

答案 2 :(得分:1)

这是@fattru的回答。

class Example
  attr_accessor :alpha, :beta, :gamma

  def initialize(alpha, beta, gamma)
    self.alpha, self.beta, self.gamma = alpha, beta, gamma
  end

  def properties(*attributes)
    attributes.map { |a| send a }
  end
end

example = Example.new('dog', 'cat', 'pig')
example.properties(:alpha, :gamma)
  #=> ["dog", "pig"] 

如果您将send a更改为send a.to_sym,则可以使用符号或字符串调用properties

example.properties('alpha', 'gamma')
  #=> ["dog", "pig"]