Tengo la siguiente lógica en mi código:
if !@players.include?(p.name)
...
end
@playerses 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
@playerses 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, Hashy 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.
ifQue al menos truepasar la enfermedad, unlessdeja pasar falsey 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 falseporque 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.
unlessestá 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 unlessestá bien para declaraciones con include?cláusulas únicas , pero, por ejemplo, cuando necesita verificar la inclusión de algo en una Arraypero 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
dorubí válido? me sale un errorsyntax error, unexpected end-of-input(funciona sido