Tengo la siguiente lógica en mi código:
if !@players.include?(p.name)
...
end
@players
es una matriz ¿Hay algún método para evitar el!
?
Idealmente, este fragmento sería:
if @players.does_not_include?(p.name)
...
end
ruby-on-rails
ruby
Tyler DeWitt
fuente
fuente
do
rubí válido? me sale un errorsyntax error, unexpected end-of-input
(funciona sido
Respuestas:
ActiveSupport agrega el
exclude?
método aArray
,Hash
yString
. Esto no es Ruby puro, pero es usado por MUCHOS rubíes.Fuente: Extensiones principales de soporte activo (guías de Rails)
fuente
require 'active_support/core_ext/enumerable'
Aqui tienes:
Puede echar un vistazo a la Guía de estilo Ruby para obtener más información sobre técnicas similares.
fuente
if flag unless @players.include?(p.name)
es incómodo yif flag && [email protected]?(p.name)
usa la negación.if
Que al menostrue
pasar la enfermedad,unless
deja pasarfalse
ynil
. Esto a veces conduce a errores difíciles de encontrar. Por eso prefieroexclude?
¿Qué tal lo siguiente:
fuente
Mirando solo a Ruby:
TL; DR
Use
none?
pasarle un bloque con==
para la comparación:Array#include?
acepta un argumento y lo usa==
para verificar cada elemento de la matriz:Enumerable#none?
También puede aceptar un argumento en cuyo caso se utiliza===
para la comparación. Para obtener el comportamiento contrarioinclude?
, omitimos el parámetro y le pasamos un bloque usando==
para la comparación.En el ejemplo anterior, podemos usar:
Eso es porque
Integer#==
yInteger#===
son equivalentes. Pero considere:none?
vuelvefalse
porqueInteger === 1 #=> true
. Pero realmentenotinclude?
debería regresar un método legítimotrue
. Entonces, como lo hicimos antes:fuente
Ok, pero en serio, a menos que funcione bien.
fuente
unless
está bien para el fragmento mostrado, pero la condición puede ser más compleja. Creo que es útil tener estos métodos negados, permiten más código declarativo.Uso
unless
:fuente
Puedes usar:
unless
es opuesto aif
, o puede usarreject
.Puede
reject
los elementos no requeridos:después de obtener los resultados, puede hacer su implementación.
fuente
El uso
unless
está bien para declaraciones coninclude?
cláusulas únicas , pero, por ejemplo, cuando necesita verificar la inclusión de algo en unaArray
pero no en otra, el uso deinclude?
withexclude?
es mucho más amigable.Pero como dizzy42 dice anteriormente, el uso de
exclude?
requiere ActiveSupportfuente
Intenta algo como esto:
fuente
Pruebe esto, es puro Ruby, por lo que no es necesario agregar ningún marco periférico
Estuve luchando con una lógica similar durante unos días, y después de revisar varios foros y tableros de preguntas y respuestas en vano, resultó que la solución era bastante simple.
fuente
Estaba buscando esto por mí mismo, encontré esto y luego una solución. Las personas usan métodos confusos y algunos métodos que no funcionan en ciertas situaciones o que no funcionan en absoluto.
Sé que es demasiado tarde ahora, teniendo en cuenta que esto se publicó hace 6 años, pero espero que los futuros visitantes encuentren esto (y con suerte, puede limpiar su código y el suyo).
Solución simple:
fuente