Eu tenho a seguinte lógica no meu código:
if !@players.include?(p.name)
...
end
@players
é uma matriz. Existe um método para que eu possa evitar o !
?
Idealmente, esse snippet seria:
if @players.does_not_include?(p.name)
...
end
ruby-on-rails
ruby
Tyler DeWitt
fonte
fonte
do
ruby é válido? Eu recebo um errosyntax error, unexpected end-of-input
(funciona se eu remover odo
)Respostas:
ActiveSupport adiciona o
exclude?
método paraArray
,Hash
, eString
. Isso não é puro Ruby, mas é usado por muitos rubiistas.Fonte: Extensões principais do suporte ativo (guias de Rails)
fonte
require 'active_support/core_ext/enumerable'
Aqui está:
Você pode dar uma olhada no Ruby Style Guide para obter mais informações sobre técnicas semelhantes.
fonte
if flag unless @players.include?(p.name)
é estranho eif flag && [email protected]?(p.name)
usa negação.if
deixar apenastrue
passar a condição,unless
vamos passarfalse
enil
. Às vezes, isso leva a erros difíceis de encontrar. Portanto, eu prefiroexclude?
Que tal o seguinte:
fonte
Olhando apenas para Ruby:
TL; DR
Use
none?
passar um bloco com==
para a comparação:Array#include?
aceita um argumento e usa==
para verificar contra cada elemento na matriz:Enumerable#none?
também pode aceitar um argumento; nesse caso, ele é usado===
para a comparação. Para obter o comportamento opostoinclude?
, omitimos o parâmetro e passamos um bloco==
para a comparação.No exemplo acima, podemos realmente usar:
Isso é porque
Integer#==
eInteger#===
é equivalente. Mas considere:none?
retornafalse
porqueInteger === 1 #=> true
. Mas realmente umnotinclude?
método legítimo deve retornartrue
. Assim como fizemos antes:fonte
Ok, mas sério, a menos que funcione bem.
fonte
unless
está ok para o snippet exibido, mas a condição pode ser mais complexa. Eu acho que é útil ter esses métodos negados, eles permitem mais código declarativo.Use
unless
:fonte
Você pode usar:
unless
é o oposto deif
, ou você pode usarreject
.Você pode
reject
os elementos não necessários:após a obtenção dos resultados, você pode fazer sua implementação.
fonte
Usar
unless
é bom para instruções cominclude?
cláusulas únicas , mas, por exemplo, quando você precisa verificar a inclusão de algo em um,Array
mas não em outro, o uso deinclude?
withexclude?
é muito mais amigável.Mas, como dizzy42 diz acima, o uso de
exclude?
requer ActiveSupportfonte
Tente algo como isto:
fonte
Tente isso, é puro Ruby, portanto não há necessidade de adicionar estruturas periféricas
Eu estava lutando com uma lógica semelhante por alguns dias e, depois de verificar vários fóruns e quadros de perguntas e respostas com pouco proveito, a solução era realmente bastante simples.
fonte
Eu estava pesquisando por mim mesmo, encontrei isso e depois uma solução. As pessoas estão usando métodos confusos e alguns métodos que não funcionam em determinadas situações ou nem sequer funcionam.
Sei que agora é tarde demais, considerando que isso foi publicado há 6 anos, mas espero que futuros visitantes encontrem isso (e espero que possa limpar o código deles e o seu).
Solução simples:
fonte