Jaka jest różnica pomiędzy
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
i
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Z jakiegoś powodu pierwsza z nich czasami działa, a druga nie, a innym razem druga działa, a pierwsza nie. Czemu? Który z nich jest „właściwym” sposobem, aby to zrobić?
ruby
duck-typing
case-statement
Daisy Sophia Hollman
źródło
źródło
MyClass === obj
używa metody Module # === do sprawdzenia, czyobj
jest to wystąpienieMyClass
.Odpowiedzi:
Musisz użyć:
case item when MyClass ...
Miałem ten sam problem: Jak wyłapać klasę Errno :: ECONNRESET w "przypadku kiedy"?
źródło
Tak, Nakilon ma rację, musisz wiedzieć, jak działa operator trzech równych === na obiekcie podanym w
when
klauzuli. W Rubycase item when MyClass ... when Array ... when String ...
jest naprawdę
if MyClass === item ... elsif Array === item ... elsif String === item ...
Zrozum, że przypadek wywołuje metodę trzech równych (
MyClass.===(item)
na przykład) i tę metodę można zdefiniować tak, aby robiła, co chcesz, a następnie możesz użyć instrukcji case z precyzjąźródło
arr = []
zauważyłem, żeif Array === arr
to oceni jako prawda, aleif arr === Array
oceni jako fałsz. Czy ktoś może pomóc wyjaśnić?Możesz użyć:
case item.class.to_s when 'MyClass'
... gdy następujący zwrot akcji nie jest możliwy:
case item when MyClass
Powodem tego jest to, że
case
używa===
, a relacja===
, którą opisuje operator, nie jest przemienna . Na przykład5
toInteger
, ale jest ? Tak powinieneś myśleć o / .Integer
5
case
when
źródło
W Rubim nazwa klasy jest stałą, która odnosi się do obiektu typu
Class
opisującego określoną klasę. Oznacza to, że mówienieMyClass
w Rubim jest równoznaczne z mówieniemMyClass.class
w Javie.obj.class
jest obiektem typuClass
opisującym klasęobj
. Jeśliobj.class
takMyClass
, toobj
został utworzony przy użyciuMyClass.new
(z grubsza mówiąc).MyClass
to obiekt typu,Class
który opisuje dowolny obiekt utworzony za pomocąMyClass.new
.MyClass.class
to klasaMyClass
obiektu (jest to klasa obiektu typuClass
opisująca dowolny obiekt utworzony za pomocąMyClass.new
). Innymi słowyMyClass.class == Class
.źródło
To zależy od charakteru twojej
item
zmiennej. Jeśli jest to instancja obiektu, npt = 5
następnie
t.class == Fixnum
ale jeśli jest to klasa sama w sobie np
wtedy będzie to
Class
obiekt, więct.class == Class
EDYCJA : zapoznaj się z Jak złapać klasę Errno :: ECONNRESET w "przypadku kiedy"? jak stwierdził Nakilon, ponieważ moja odpowiedź może być błędna.
źródło