我正在尝试实现我的第一个ruby排序算法。该算法基于一些特定的规则(“总是喜欢xy类型的对象,类型yyy的对象”),如果没有触发这些规则,它使用ruby< => -operator。我是在ruby-on-rails一对多协会上做的。
问题是这个algortihm没有返回数组本身,它只返回-1或1,比较的结果。但实际上我不明白为什么,因为我的结果只在sort-block中返回
这是我目前的代码:
def sort_products!
products.sort! do |p1, p2|
result = 0
# Scalable Products are always the last ones in order
if p1.class.name == "ScalableProduct"
result = -1
elsif p2.class.name == "ScalableProduct"
result = 1
end
if result == 0
# Put products producing electricity and heating down
if p1.can_deliver_electricity?
result = -1
elsif p2.can_deliver_electricity?
result = 1
end
end
# Else: Just compare names
result = p1.name <=> p2.name if result == 0
result
end
end
答案 0 :(得分:0)
在我看来,这里的最佳做法是在<=>
模型中实施Product
。您需要包含Comparable
模型才能实现此目的:
class Product
include Comparable
def <=>(another_product)
# Compare self with another_product
# Return -1, 0, or 1
end
end
然后您的排序方法将简化为:
def sort_products!
products.sort!
end
答案 1 :(得分:0)
将括号的do..end
更改为块的分隔符。它首先进行排序,然后在结果上使用块(因为precedence of the do..end syntax)。使用括号,它使用块作为排序块,这是你想要的。
此外,在您的比较中,如果您的产品都是ScalableProduct
,那么您不会以合理的方式订购它们。如果它们同时为ScalableProduct
,您可能希望将result
保留为0
,以便按照名称进行比较。同样处理can_deliver_electricity?
。