我如何将排序标准传递给方法,以便sort_by可以使用它

问题描述

|| 如何将属性名称传递给方法“ 0”,并在其中使用它?例如,假设我想用单例对象objects2ѭ数组创建create1ѭ。 (它们是单例很重要,因为这意味着将有一定数量的相同
Foo
)。
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
当我创建Frequency对象时:
@fc = FrequencyCounter.new([Foo.get(5),Foo.get(4),Foo.get(5),Foo.get(1)])
我想告诉
@fc
订购什么:
@fc.sort_by(:arbitrary_sorter)
这可能吗?     

解决方法

        在任何枚举器上,您都可以告诉它排序依据。因此,让我们举一个简单的例子:
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,dog]
您可以进行事件处理,例如:
sorter_lambda = lambda {|animal| animal.name == \"human\" ? 0 : 999}
animals.sort_by(&sorter_lambda)
 => [human,snake] 
我看到的复杂逻辑对您而言,lambda可能最适合您。