W moim kodzie mam następującą logikę:
if !@players.include?(p.name)
...
end
@players
jest tablicą. Czy istnieje metoda, dzięki której mogę uniknąć !
?
Najlepiej byłoby, gdyby ten fragment był:
if @players.does_not_include?(p.name)
...
end
ruby-on-rails
ruby
Tyler DeWitt
źródło
źródło
do
prawidłowy rubin? dostaję błądsyntax error, unexpected end-of-input
(działa, jeślido
Odpowiedzi:
ActiveSupport dodaje
exclude?
metodęArray
,Hash
orazString
. To nie jest czysty rubin, ale jest używany przez WIELU rubinów.Źródło: Główne rozszerzenia Active Support (przewodniki po szynach)
źródło
require 'active_support/core_ext/enumerable'
Proszę bardzo:
Możesz zajrzeć do Przewodnika po stylu Ruby, aby uzyskać więcej informacji na temat podobnych technik.
źródło
if flag unless @players.include?(p.name)
jest niezręczny iif flag && [email protected]?(p.name)
używa negacji.if
tylko niechtrue
przechodzą stan,unless
pozwala przejśćfalse
inil
. To czasami prowadzi do trudnych do znalezienia błędów. Dlatego wolęexclude?
Co powiesz na następujące:
źródło
Patrząc tylko na Ruby:
TL; DR
Użyj do porównania
none?
bloku z==
do:Array#include?
akceptuje jeden argument i używa==
do sprawdzenia każdego elementu w tablicy:Enumerable#none?
może również zaakceptować jeden argument, w którym to przypadku używa go===
do porównania. Aby uzyskać przeciwne zachowanieinclude?
, pomijamy parametr i przekazujemy go do bloku za pomocą==
porównania.W powyższym przykładzie możemy faktycznie użyć:
To dlatego, że
Integer#==
iInteger#===
są równoważne. Ale zastanów się:none?
zwracafalse
ponieważInteger === 1 #=> true
. Ale naprawdę legalnanotinclude?
metoda powinna powrócićtrue
. Tak jak wcześniej:źródło
Ok, ale poważnie, chyba że działa dobrze.
źródło
unless
jest w porządku dla pokazanego fragmentu, ale warunek może być bardziej złożony. Myślę, że warto mieć te zanegowane metody, które pozwalają na bardziej deklaratywny kod.Użyj
unless
:źródło
Czy możesz użyć:
unless
jest przeciwieństwemif
lub możesz użyćreject
.Możesz
reject
niepotrzebne elementy:po uzyskaniu wyników możesz wykonać swoją implementację.
źródło
Używanie
unless
jest w porządku dla instrukcji z pojedynczymiinclude?
klauzulami, ale na przykład, gdy trzeba sprawdzić włączenie czegoś w jednym,Array
ale nie w drugim, użycieinclude?
zexclude?
jest znacznie bardziej przyjazne.Ale jak mówi dizzy42 powyżej, użycie
exclude?
wymaga ActiveSupportźródło
Wypróbuj coś takiego:
źródło
Spróbuj, to jest czysty Ruby, więc nie trzeba dodawać żadnych peryferyjnych ram
Przez kilka dni zmagałem się z podobną logiką, a po sprawdzeniu kilku forów i forum pytań i odpowiedzi okazało się, że rozwiązanie było dość proste.
źródło
Patrzyłem na to dla siebie, znalazłem to, a potem rozwiązanie. Ludzie używają mylących metod i niektórych metod, które nie działają w określonych sytuacjach lub wcale.
Wiem, że jest już za późno, biorąc pod uwagę, że został opublikowany 6 lat temu, ale mam nadzieję, że przyszli odwiedzający to znajdą (i mam nadzieję, że to może wyczyścić ich i twój kod).
Proste rozwiązanie:
źródło