Nie mogę łatwo sprawdzić, czy obiekt jest wartością logiczną. Czy jest coś takiego w Rubim?
true.is_a?(Boolean)
false.is_a?(Boolean)
Teraz robię to i chciałbym to skrócić:
some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
ruby
typechecking
Lance Pollard
źródło
źródło
Odpowiedzi:
Najprościej przychodzi mi do głowy:
źródło
Uważam, że jest to zwięzłe i samodokumentujące się:
Jeśli używasz Rails lub ActiveSupport, możesz nawet wykonać bezpośrednie zapytanie za pomocą
in?
Sprawdzanie wszystkich możliwych wartości nie jest czymś, co polecałbym w przypadku wartości zmiennoprzecinkowych, ale jest wykonalne, gdy są tylko dwie możliwe wartości!
źródło
foo == true or foo == false
że ktoś umieścił komentarz.!!foo == foo
.W
Boolean
Rubim nie ma klasy, jedynym sposobem sprawdzenia jest zrobienie tego, co robisz (porównanie obiektu ztrue
ifalse
lub klasą obiektu zTrueClass
iFalseClass
). Nie mogę jednak wymyślić, dlaczego potrzebujesz tej funkcji, czy możesz to wyjaśnić? :)Jeśli jednak naprawdę potrzebujesz tej funkcji, możesz zhakować ją w:
źródło
expect(some_method?(data)).to be_a(Boolean)
"quotes"
liczbami i wartościami logicznymi, ale nie z liczbami i wartościami logicznymiJak wspomniano powyżej, nie ma klasy boolowskiej tylko TrueClass i FalseClass, jednak możesz użyć dowolnego obiektu jako podmiotu if /orrow i wszystko jest prawdziwe z wyjątkiem instancji FalseClass i nil
Testy logiczne zwracają wystąpienie FalseClass lub TrueClass
Następująca monkeypatch do Object powie Ci, czy coś jest instancją TrueClass czy FalseClass
Wykonanie niektórych testów z irb daje następujące wyniki
źródło
self == true or self == false
. To jedyne wystąpienia TrueClass i FalseClass.boolean
, jedną dla TrueClass / FalseClass i jedną dla Object.Time#==
Rubiego 1.8 powoduje, że porównanie z wartościami innymi niż Time zwraca zero, a nie fałsz.Jeśli twój kod można rozsądnie zapisać jako instrukcję, jest to całkiem przyzwoite:
źródło
Obiekt, który jest wartością logiczną, będzie miał klasę TrueClass lub FalseClass, więc poniższy wiersz powinien załatwić sprawę
Poniższe również dałoby wynik sprawdzenia typu boolowskiego prawda / fałsz
źródło
Więc wypróbuj tę
(x == true) ^ (x == false)
notatkę, potrzebujesz nawiasu, ale jest piękniejszy i bardziej zwarty.Spełnia nawet sugestie, takie jak „cuak”, ale nie „cuak” ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Uwaga : zobacz, że jest to tak podstawowe, że możesz go używać również w innych językach, co nie zapewnia „rzeczy jest logiczne”.
Uwaga 2 : Możesz również użyć tego, aby powiedzieć, że rzecz jest jedną z ??:
"red", "green", "blue"
jeśliadd more XORS
... lub powiesz, że ta rzecz jest jedną z ??:4, 5, 8, 35
.źródło
Ten klejnot dodaje klasę Boolean do Rubiego za pomocą przydatnych metod.
https://github.com/RISCfuture/boolean
Posługiwać się:
Wtedy twój
będzie działać dokładnie tak, jak oczekujesz.
źródło
Nie. Nie tak, jak masz swój kod. Nie ma klasy o nazwie Boolean. Teraz, mając wszystkie odpowiedzi, powinieneś być w stanie je utworzyć i używać. Wiesz, jak tworzyć zajęcia, prawda? Przyjechałem tutaj tylko dlatego, że sam zastanawiałem się nad tym pomysłem. Wiele osób może powiedzieć „Dlaczego? Musisz tylko wiedzieć, w jaki sposób Ruby używa wartości logicznych”. Dlatego otrzymałeś odpowiedzi, które zrobiłeś. Więc dziękuję za pytanie. Do przemyślenia. Dlaczego Ruby nie ma klasy logicznej?
Pamiętaj, że obiekty nie mają typów. To są klasy. Obiekty mają dane. Dlatego kiedy mówisz o typach danych, jest to trochę mylące.
Spróbuj także rand 2, ponieważ rand 1 wydaje się zawsze dawać 0. rand 2 da 1 lub 0 kliknięć kilka razy tutaj. https://repl.it/IOPx/7
Chociaż sam nie wiedziałbym, jak zrobić klasę boolowską. Eksperymentowałem z tym, ale ...
Przynajmniej mamy teraz tę klasę, ale kto wie, jak uzyskać właściwe wartości?
źródło