如何将排序条件传递给方法,以便sort_by可以使用它

时间:2011-06-12 17:13:04

标签: ruby-on-rails ruby

如何将属性名称传递给方法sort_by,并在其中使用?例如,假设我想创建一个包含单个对象FrequencyCounter数组的Foo。 (重要的是他们是单身人士,因为这意味着会有一定数量的相同Foo s。)

class Foo
  attr_accessor :arbitrary_sorter
  def initialize arbitrary_sorter
    @arbitrary_sorter = arbitrary_sorter
  end
end

class FrequencyCounter
  def initialize ary
    #multiset will create a hash of frequency like {3=>obj, 2->obj, 2=>obj, etc}
    @hash = Multiset.new(ary).hash
  end

  def sort_by params={}
    Hash[@hash.sort_by {|k,v| [-1 * v, -1 * k]}]
  end
end

当我创建频率对象时:

@fc = FrequencyCounter.new([Foo.get(5), Foo.get(4), Foo.get(5), Foo.get(1)])

我想告诉@fc要点什么:

@fc.sort_by(:arbitrary_sorter)

这可能吗?

1 个答案:

答案 0 :(得分:1)

在任何枚举器上,您可以告诉它要排序的内容。那么,让我们举一个简单的例子:

class Animal
  attr_accessor :name, :leg_count
  def initialize(name, leg_count)
    @name = name
    @leg_count = leg_count
  end
  def to_s
    @name
  end
end

animals = [Animal.new('human', 2), Animal.new('dog', 4), Animal.new('snake', 0)]
 => [human, dog, snake] 

# sort by an attribute or method on the model
animals.sort_by{|a| a.leg_count} 
 => [snake, human, dog] 

同样:

animals.sort_by(&:leg_count)
 => [snake, human, dog]

您可以执行以下操作:

sorter_lambda = lambda {|animal| animal.name == "human" ? 0 : 999}
animals.sort_by(&sorter_lambda)
 => [human, dog, snake] 

使用我看到的复杂逻辑,lambda可能最适合你。