Jaka jest różnica? Kiedy powinienem użyć które? Dlaczego jest ich tak wiele?
Jaka jest różnica? Kiedy powinienem użyć które? Dlaczego jest ich tak wiele?
Odpowiedzi:
kind_of?
i is_a?
są synonimami.
instance_of?
różni się od pozostałych dwóch tym, że zwraca tylko true
wtedy, gdy obiekt jest instancją tej właśnie klasy, a nie podklasą.
Przykład:
"hello".is_a? Object
i "hello".kind_of? Object
zwróć, true
ponieważ "hello"
jest a String
i String
jest podklasą Object
."hello".instance_of? Object
powraca false
.@honda.kind_of? Car
i @person.is_a? Administrator
, Ruby jest o estetyce. W rzeczywistości zwróć uwagę na błąd gramatyczny ... przy aktywnym wsparciu, które możesz napisać:) @person.is_an? Administrator
... To mogło już teraz stać się rdzeniem Rubiego.
kind_of?
ale nie is_a?
?
is_an?
nie ma w ruby-1.9.2-p0. @Claudiu, no. is_a?
jest tylko aliasemkind_of?
. Obie metody powołać się na tej samej funkcji c, rb_obj_is_kind_of
.
kind_of?
bez zastępowania is_a?
.
is_an?
metoda ActiceSupport ?! Nie ma go w bieżącej wersji Railsów i nie mogę znaleźć niczego w Google na temat wycofania go.
Jaka jest różnica?
Z dokumentacji:
- - ( boolean )
instance_of?(class)
- Zwraca
true
ifobj
jest instancją danej klasy.
i:
- - ( Boolean )
is_a?(class)
- ( Boolean )kind_of?(class)
- Zwraca
true
jeśliclass
jest klasąobj
lubclass
jedną z nadklasobj
lub modułów zawartych wobj
.
Jeśli nie jest to jasne, dobrze byłoby wiedzieć, co dokładnie jest niejasne, aby można było ulepszyć dokumentację.
Kiedy powinienem użyć które?
Nigdy. Zamiast tego użyj polimorfizmu.
Dlaczego jest ich tak wiele?
Nie nazwałbym dwóch „wieloma”. Są dwie, ponieważ robią dwie różne rzeczy.
Bardziej rubinowe jest pytanie obiektów, czy odpowiadają na metodę, której potrzebujesz, czy nie, używając respond_to?
. Pozwala to na minimalizację interfejsu i nieświadomego programowania.
Oczywiście nie zawsze ma to zastosowanie, dlatego nadal istnieje możliwość zapytania o bardziej konserwatywne rozumienie „typu”, czyli klasy lub klasy bazowej, przy użyciu metod, o które pytasz.
Nie nazwałbym też dwóch wielu ( is_a?
i kind_of?
są to aliasy tej samej metody), ale jeśli chcesz zobaczyć więcej możliwości, zwróć uwagę na #class
metodę:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
is_a?
i drugiekind_of?
: istnieje, jak sądzę, część filozofii projektowej Ruby. Python powiedziałby, że powinien być tylko jeden sposób na zrobienie czegoś; Ruby często ma synonimiczne metody, więc możesz użyć tej, która brzmi lepiej. To kwestia preferencji. Może to częściowo wynikać z wpływów Japonii: Powiedziano mi, że użyją innego słowa dla tej samej liczby w zależności od zdania, aby brzmiało to ładniej. Matz mógł przenieść tę ideę do swojego projektu językowego.