Co ma class << self
zrobić w Ruby ?
ruby
metaclass
eigenclass
singleton
randombits
źródło
źródło
Odpowiedzi:
Po pierwsze,
class << foo
składnia otwierafoo
klasę singleton (eigenclass). Pozwala to na specjalizację zachowania metod wywoływanych na tym konkretnym obiekcie.Teraz, aby odpowiedzieć na pytanie:
class << self
otwieraself
singletonową klasę, dzięki czemu można przedefiniować metody dla bieżącegoself
obiektu (który wewnątrz ciała klasy lub modułu jest samą klasą lub modułem ). Zwykle służy to do definiowania metod klasy / modułu („statycznych”):Można to również zapisać jako skrót:
Lub nawet krócej:
Znajdując się w definicji funkcji,
self
odnosi się do obiektu, za pomocą którego funkcja jest wywoływana. W takim przypadkuclass << self
otwiera klasę singleton dla tego obiektu; jednym z nich jest zaimplementowanie automatu stanów biednego człowieka:Tak więc w powyższym przykładzie każde wystąpienie aliasu
StateMachineExample
zostałoprocess_hook
przypisane do aliasuprocess_state_1
, ale zwróć uwagę na to, jak w tym drugim przypadku może ono przedefiniowaćprocess_hook
(self
tylko nie wpływając na inneStateMachineExample
wystąpienia) naprocess_state_2
. Tak więc, za każdym razem, gdy wywołujący wywołujeprocess
metodę (która wywołuje funkcję redefiniowalnąprocess_hook
), zachowanie zmienia się w zależności od tego, w jakim jest stanie.źródło
class << self
tworzenia klas / modułów. Prawdopodobnie rozwinę to zastosowanieclass << self
, ponieważ jest to o wiele bardziej idiomatyczne zastosowanie.a
„ssingleton_class
oda
” s klasy (po zmianieinspect
) to unikalny wariantString
klasy. Gdyby zmieniłString
klasę singletonów , wpłynęłoby to na wszystkie inneString
instancje. Dziwniejsze jest to, że jeśli później ponownie otworzysz,String
aby ponownie zdefiniować,inspect
toa
nadal wybierzesz nowe zmiany.class << self
oznacza, że cokolwiek więcej niż wartośćself
jest równa klasie singletonu w zakresie bloku?Znalazłem super proste wyjaśnienie
class << self
,Eigenclass
oraz różnego rodzaju metod.W Ruby istnieją trzy typy metod, które można zastosować do klasy:
Metody instancji i metody klas są prawie podobne do ich homonimów w innych językach programowania.
Innym sposobem uzyskania dostępu do
Eigenclass
(który obejmuje metody singleton) jest następująca składnia (class <<
):teraz możesz zdefiniować metodę singleton, dla
self
którejFoo
sama klasa jest w tym kontekście:źródło
foo.singleton_class.instance_methods(false)
do sprawdzenia.Zazwyczaj metody instancji są metodami globalnymi. Oznacza to, że są dostępne we wszystkich instancjach klasy, w której zostały zdefiniowane. Natomiast metoda singletonu jest implementowana na jednym obiekcie.
Ruby przechowuje metody w klasach i wszystkie metody muszą być powiązane z klasą. Obiekt, w którym zdefiniowana jest metoda singleton, nie jest klasą (jest instancją klasy). Jeśli tylko klasy mogą przechowywać metody, w jaki sposób obiekt może przechowywać metodę singleton? Kiedy tworzona jest metoda singleton, Ruby automatycznie tworzy anonimową klasę do przechowywania tej metody. Te anonimowe klasy nazywane są metaklasami, znanymi również jako klasy singleton lub klasy eigenclasses. Metoda singletonu jest powiązana z metaklasą, która z kolei jest powiązana z obiektem, na którym zdefiniowano metodę singletonu.
Jeśli w jednym obiekcie zdefiniowano wiele metod singletonów, wszystkie są przechowywane w tej samej metaklasie.
W powyższym przykładzie klasa << z1 zmienia bieżące „ja”, aby wskazywało metaklasę obiektu z1; następnie definiuje metodę say_hello w metaklasie.
Klasy są również obiektami (instancjami wbudowanej klasy o nazwie Class). Metody klasy są niczym więcej niż metodami singletonowymi powiązanymi z obiektem klasy.
Wszystkie obiekty mogą mieć metaklasy. Oznacza to, że klasy mogą mieć także metaklasy. W powyższym przykładzie klasa << self modyfikuje self, więc wskazuje na metaklasę klasy Zabuton. Kiedy metoda jest zdefiniowana bez jawnego odbiornika (klasy / obiektu, na którym metoda zostanie zdefiniowana), jest ona domyślnie zdefiniowana w ramach bieżącego zakresu, to znaczy bieżącej wartości self. Dlatego metoda rzeczy jest zdefiniowana w metaklasie klasy Zabuton. Powyższy przykład jest tylko innym sposobem zdefiniowania metody klasy. IMHO, lepiej jest użyć składni def self.my_new_clas_method do zdefiniowania metod klas, ponieważ ułatwia to zrozumienie kodu. Powyższy przykład został dołączony, abyśmy rozumieli, co się dzieje, gdy natrafimy na składnię << siebie składni klasy.
Dodatkowe informacje można znaleźć w tym poście na temat klas Ruby .
źródło
Czym zajmuje się klasa <<:
[robi
self == thing.singleton_class
w kontekście swojego bloku] .Co to jest thing.singleton_class?
hi
obiekt dziedziczy#methods
po nim,#singleton_class.instance_methods
a następnie po nim#class.instance_methods
.Tutaj daliśmy
hi
„s singleton klasy metody instancji:a
. Można to zrobić za pomocą klasy << hi zamiast tego.hi
„S#singleton_class
ma wszystkie metody instancjihi
” S#class
ma, ewentualnie nieco więcej (:a
o).[instancyjne metody rzeczy
#class
i#singleton_class
mogą być stosowane bezpośrednio do rzeczy. kiedy Ruby widzi rzecz. a, najpierw szuka: definicji metody w thing.singleton_class.instance_methods, a następnie w thing.class.instance_methods]Nawiasem mówiąc - nazywają obiektu Singleton klasy == metaklasa == eigenclass .
źródło
Á sposób Singleton jest sposób, który jest zdefiniowany jedynie na pojedynczy obiekt.
Przykład:
Metody Singletona w SomeClass
test
Metody singletona z test_obj
test_2
test_3
źródło
W rzeczywistości, jeśli napiszesz jakieś rozszerzenia C dla swoich projektów Ruby, jest tak naprawdę tylko jeden sposób na zdefiniowanie metody Module.
Wiem, że ten własny biznes po prostu otwiera wiele innych pytań, dzięki czemu możesz lepiej przeszukać każdą część.
Przede wszystkim obiekty.
Czy mogę stworzyć metodę foo?
Pewnie
Co mam z tym zrobić?
Po prostu kolejny przedmiot.
Otrzymasz wszystkie metody Object plus swoją nową.
Tylko obiekt foo.
Spróbuj zobaczyć, co się stanie, jeśli zrobisz foo z innych obiektów, takich jak klasa i moduł. Przykłady wszystkich odpowiedzi są fajne, ale musisz pracować z różnymi pomysłami lub koncepcjami, aby naprawdę zrozumieć, co się dzieje ze sposobem pisania kodu. Masz teraz wiele warunków do obejrzenia.
Wychowano Singleton, Class, Module, self, Object i Eigenclass, ale Ruby nie nazywa w ten sposób Modelów Obiektów. To bardziej jak Metaklasa. Richard lub __why pokazuje ci ten pomysł tutaj. http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html A jeśli cię to zaskoczy, spróbuj poszukać Ruby Object Model w poszukiwaniu. Dwa filmy, które znam na YouTube to Dave Thomas i Peter Cooper. Próbują również wyjaśnić tę koncepcję. Zdobycie go zajęło Dave'owi dużo czasu, więc nie martw się. Nadal nad tym pracuję. Po co miałbym tu być? Dziękuję za twoje pytanie. Zobacz także bibliotekę standardową. Ma moduł Singleton, tak jak FYI.
To całkiem nieźle. https://www.youtube.com/watch?v=i4uiyWA8eFk
źródło