Classificar objetos por valores booleanos em rubi
-
05-09-2019 - |
Pergunta
Minhas desculpas se isso já foi respondido antes ou é óbvio ... algumas pesquisas aqui e no Googre e não conseguiram encontrar uma resposta.
Estou procurando classificar uma variedade de fornecedores por preço e se eles são um preferido_provider? (verdadeiro ou falso)
Por exemplo array p of Providers
...
p1.price == 1, p1.preferred_provider? == false
p2.price == 2, p2.preferred_provider? == true
p2.price == 3, p3.preferred_provider? == true
Eu gostaria de p.sort_by e obter:
[p2 p3 p1]
IAW
p.sort_by {|x| x.preferred_provider?, x.price }
não funciona e fica ...
undefined method `<=>' for false:FalseClass
Alguma sugestão sobre melhores maneiras de abordar esse problema?
Solução
A maioria dos idiomas fornece funções de classificação que aceitam comparadores Para esse tipo de coisa. Em Ruby, isso é apenas Array.Sort:
p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider?
then a.price <=> b.price
elsif a.preferred_provider?
1
else -1
}
Outras dicas
Você poderia definir um <=>
no Provider
classe para fazer o que quiser e depois classificar usando o Array.sort
método (ao invés de Enumerable.sort_by
). Aqui está uma definição de <=>
que eu preparei:
class Provider
def <=>(other)
if preferred_provider?
if other.preferred_provider?
@price <=> other.price
else
1
end
else
if other.preferred_provider?
-1
else
@price <=> other.price
end
end
end
end
Então, se você tiver sua matriz p
, você poderia simplesmente fazer p_sorted = p.sort
.
(Observe que eu não testei este código, então pode haver alguns erros, mas acho que serve para demonstrar a ideia.)