Ruby按对象的属性排序,基于关键字字符串

时间:2017-09-05 13:44:07

标签: ruby sorting

我有一个名为sortKeyword的字符串。我想按属性对对象数组进行排序,但要排序的属性取决于sortKeyword

例如:当sortKeyword是'name'时,我想对对象''name'属性进行排序,当sortKeyword为'age'时我想对对象的age属性进行排序等...

sortKeyword有10个可能的值,所以我自然不会有10个案例的switch语句。在Ruby中有更好的方法吗?

3 个答案:

答案 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)

中,可以通过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>]