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
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
Respuestas:
if @players.exclude?(p.name)
...
end
ActiveSupport agrega el exclude?
método a Array
, Hash
y String
. Esto no es Ruby puro, pero es usado por MUCHOS rubíes.
Fuente: Extensiones principales de soporte activo (guías de Rails)
require 'active_support/core_ext/enumerable'
Aqui tienes:
unless @players.include?(p.name)
...
end
Puede echar un vistazo a la Guía de estilo Ruby para obtener más información sobre técnicas similares.
if flag unless @players.include?(p.name)
es incómodo y if flag && !@players.include?(p.name)
usa la negación.
if
Que al menos true
pasar la enfermedad, unless
deja pasar false
y nil
. Esto a veces conduce a errores difíciles de encontrar. Por eso prefieroexclude?
¿Qué tal lo siguiente:
unless @players.include?(p.name)
....
end
Mirando solo a Ruby:
TL; DR
Use none?
pasarle un bloque con ==
para la comparación:
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?
acepta un argumento y lo usa ==
para verificar cada elemento de la matriz:
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?
También puede aceptar un argumento en cuyo caso se utiliza ===
para la comparación. Para obtener el comportamiento contrario include?
, omitimos el parámetro y le pasamos un bloque usando ==
para la comparación.
player.none? { |n| 7 == n }
#=> true
!player.include?(7) #notice the '!'
#=> true
En el ejemplo anterior, podemos usar:
player.none?(7)
#=> true
Eso es porque Integer#==
y Integer#===
son equivalentes. Pero considere:
player.include?(Integer)
#=> false
player.none?(Integer)
#=> false
none?
vuelve false
porque Integer === 1 #=> true
. Pero realmente notinclude?
debería regresar un método legítimo true
. Entonces, como lo hicimos antes:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
Ok, pero en serio, a menos que funcione bien.
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
:
unless @players.include?(p.name) do
...
end
El uso unless
está bien para declaraciones con include?
cláusulas únicas , pero, por ejemplo, cuando necesita verificar la inclusión de algo en una Array
pero no en otra, el uso de include?
with exclude?
es mucho más amigable.
if @players.include? && @spectators.exclude? do
....
end
Pero como dizzy42 dice anteriormente, el uso de exclude?
requiere ActiveSupport
Pruebe esto, es puro Ruby, por lo que no es necesario agregar ningún marco periférico
if @players.include?(p.name) == false do
...
end
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.
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:
if not @players.include?(p.name) do
....
end
do
rubí válido? me sale un errorsyntax error, unexpected end-of-input
(funciona sido