如何将属性名称传递给方法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)
这可能吗?
答案 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可能最适合你。