Jaka jest różnica? Kiedy powinienem użyć które? Dlaczego jest ich tak wiele?
ruby
inheritance
introspection
Claudiu
źródło
źródło
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.Odpowiedzi:
kind_of?
iis_a?
są synonimami.instance_of?
różni się od pozostałych dwóch tym, że zwraca tylkotrue
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 aString
iString
jest podklasąObject
."hello".instance_of? Object
powracafalse
.źródło
@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 nieis_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ępowaniais_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.Z dokumentacji:
i:
Jeśli nie jest to jasne, dobrze byłoby wiedzieć, co dokładnie jest niejasne, aby można było ulepszyć dokumentację.
Nigdy. Zamiast tego użyj polimorfizmu.
Nie nazwałbym dwóch „wieloma”. Są dwie, ponieważ robią dwie różne rzeczy.
źródło
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.
źródło
Nie nazwałbym też dwóch wielu (
is_a?
ikind_of?
są to aliasy tej samej metody), ale jeśli chcesz zobaczyć więcej możliwości, zwróć uwagę na#class
metodę:źródło