Nie mam doświadczenia w Rubim, więc mój kod wydaje się „brzydki” i nie jest idiomatyczny:
def logged_in?
!user.nil?
end
Wolałbym mieć coś takiego
def logged_in?
user.not_nil?
end
Ale nie mogę znaleźć takiej metody, która jest sprzeczna nil?
ruby-on-rails
ruby
null
Berkes
źródło
źródło
present?
wymaga niepustego ciągu.! "".nil?
zwraca prawdę, ale"".present?
zwraca fałsz.false.present? == false
!false.nil? == true
Wydajesz się zbytnio przejmować wartościami logicznymi.
def logged_in? user end
Jeśli użytkownik ma wartość zero, to logged_in? zwróci wartość „falsey”. W przeciwnym razie zwróci obiekt. W Rubim nie musimy zwracać true ani false, ponieważ mamy wartości „truey” i „falsey”, jak w JavaScript.
Aktualizacja
Jeśli używasz Railsów, możesz ładniej to czytać używając
present?
metody:def logged_in? user.present? end
źródło
?
jest takie, że zwraca wartość logiczną.!!value
to klasyczny sposób konwertowania czegokolwiek na wartość logiczną. Nie do końca to samo, ale w tym przypadkuObject#present?
w RoR też jest dobrze.Uważaj na inne odpowiedzi przedstawiające
present?
odpowiedź na Twoje pytanie.present?
jest przeciwieństwemblank?
w szynach.present?
sprawdza, czy istnieje znacząca wartość. Te rzeczy mogą się nie udaćpresent?
:"".present? # false " ".present? # false [].present? # false false.present? # false YourActiveRecordModel.where("false = true").present? # false
Natomiast
!nil?
czek daje:!"".nil? # true !" ".nil? # true ![].nil? # true !false.nil? # true !YourActiveRecordModel.where("false = true").nil? # true
nil?
sprawdza, czy obiekt jest rzeczywiścienil
. Coś jeszcze: pusty ciąg0
,false
niezależnie, nie jestnil
.present?
jest bardzo przydatne, ale zdecydowanie nie jest przeciwieństwemnil?
. Mylenie tych dwóch może prowadzić do nieoczekiwanych błędów.Twój przypadek użycia
present?
zadziała, ale zawsze dobrze jest być świadomym różnicy.źródło
false.blank?
to nie to samo, cofalse.nil?
present?
zapyta twoją bazę danych,nil?
nie, uważaj na toMoże to mogłoby być podejście:
class Object def not_nil? !nil? end end
źródło
!self.nil?
raczej nie powinno tak być!nil?
, czy też jest toself
dorozumiane?Możesz po prostu użyć następujących:
if object p "object exists" else p "object does not exist" end
To działa nie tylko w przypadku nil, ale także false itp., Więc powinieneś przetestować, czy działa w twoim przypadku.
źródło
Czy mogę zaoferować Ruby-esque
!
metodę na wynikach tejnil?
metody.def logged_in? user.nil?.! end
Tak ezoteryczne, że RubyMine IDE oznaczy to jako błąd. ;-)
źródło
Doszedłem do tego pytania, szukając metody obiektowej, abym mógł użyć
Symbol#to_proc
skrótu zamiast bloku; Uważam, że jestarr.find(&:not_nil?)
nieco bardziej czytelny niżarr.find { |e| !e.nil? }
.Metoda, którą znalazłem, to
Object#itself
. W moim przypadku chciałem znaleźć wartość w skrócie kluczaname
, gdzie w niektórych przypadkach ten klucz został przypadkowo zamieniony na wielką literę jakoName
. Ten jednolinijkowy jest następujący:# Extract values for several possible keys # and find the first non-nil one ["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Jak zauważono w innych odpowiedziach , zakończy się to spektakularnym niepowodzeniem w przypadkach, gdy testujesz wartość logiczną.
źródło
my_hash.values_at("Name", "name").find
?map
, którą usunąłem dla uproszczenia w tym przykładzie, więc jak napisano tutaj, jest ona wymiennavalues_at
. Ważną częścią jest to, co jest przekazywanefind
.