想象一下,我有一个example
对象,其中包含以下属性:alpha
,beta
,charlie
,delta
,echo
,{{1 },foxtrot
,gamma
。
我想将其中一些属性的值收集到数组中。
我能做到:
hotel
但有没有办法避免重复该对象?
如果它是我可以做的单一财产:
properties = [example.beta, example.delta, example.gamma, example.hotel]
所以我正在寻找相当于此的东西(它不起作用):
properties = example.map(&:beta)
答案 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"]