如何解决我如何将排序标准传递给方法,以便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可能最适合您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。