2011-06-12 55 views
0

如何將屬性名稱傳遞給方法sort_by並在其中使用?例如,假設我想創建一個FrequencyCounter,其中包含一組單身對象Foo。 (重要的是他們是單身人士,因爲這意味着會有一定數量的相同的Foo s)。如何將排序條件傳遞給方法以便可以使用sort_by

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

什麼是'Foo.get'?它沒有被定義。 – sawa 2011-06-12 17:27:12

+0

這只是一種檢索具有給定任意值的singleton值的方法 – 2011-06-12 17:28:03

回答

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] 

拉姆達可能工作最適合你用複雜的邏輯我看見。

相關問題