我有一个名为sortKeyword
的字符串。我想按属性对对象数组进行排序,但要排序的属性取决于sortKeyword
。
例如:当sortKeyword
是'name'时,我想对对象''name'属性进行排序,当sortKeyword
为'age'时我想对对象的age属性进行排序等...
sortKeyword
有10个可能的值,所以我自然不会有10个案例的switch语句。在Ruby中有更好的方法吗?
答案 0 :(得分:4)
尝试使用public_send
方法
array.sort_by { |item| item.public_send(sort_keyword) }
https://ruby-doc.org/core-2.4.1/Object.html#method-i-public_send
答案 1 :(得分:1)
在ruby-on-rails中,可以通过attributes
getter获取对象的属性。在普通的旧红宝石中,请参考@Ursus的答案。
array.sort_by { |e| e.attributes[SORTER] }
答案 2 :(得分:1)
def sort_em(arr, attr)
arr.sort_by { |e| e.instance_variable_get "@#{attr}" }
end
我们试一试。
class Pets
def initialize(x,y,z)
@dog = x
@cat = y
@pig = z
end
end
a = Pets.new(1, 3, 2)
#=> #<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>
b = Pets.new(2, 1, 3)
#=> #<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>
c = Pets.new(3, 2, 1)
#=> #<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>
arr = [a, b, c]
sort_em(arr, "dog")
#=> [#<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>,
# #<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>,
# #<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>]
sort_em(arr, "cat")
#=> [#<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>,
# #<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>,
# #<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>]
sort_em(arr, "pig")
#=> [#<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>,
# #<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>,
# #<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>]