Wybacz moją ignorancję, ale co to jest protokół Metaobject i czy Ruby ma jeden? Jeśli nie, czy możliwe jest zaimplementowanie jednego dla Ruby? Jakie funkcje może posiadać protokół Metaobject, jeśli miałby je mieć Ruby?Czy Ruby ma protokół Metaobject, a jeśli nie, czy można go zaimplementować?
Odpowiedz
Co to jest protokół Metaobject?
Najlepszy opis Natknąłem się z dokumentacją Class::MOP
:
Meta protokół przedmiot jest API do systemu nawigacji.
Mówiąc dokładniej, abstrakcyjnie komponenty systemu obiektowego (klasy, obiekt, metody, atrybuty obiektu itp.). Te abstrakcje mogą następnie zostać wykorzystane do sprawdzenia i manipulowania systemem obiektów, który opisują.
Można powiedzieć, że istnieją dwa MOPy dla dowolnego systemu obiektowego; niejawny MOP i jawny MOP. Niejawne MOP obsługuje takie rzeczy jak wysyłanie lub dziedziczenie metod, które odbywają się automatycznie w ramach działania systemu obiektowego. MOP jawny zwykle obsługuje funkcje introspekcji/refleksji systemu obiektowego.
Wszystkie systemy obiektowe mają domyślne MOP. Bez jednego nie działałyby. Jawne MOP-y są znacznie rzadsze i zależnie od języka mogą się różnić od restrykcyjnych (Odbicie w Javie lub C#) do szeroko otwartego (CLOS jest doskonałym przykładem).
Czy Ruby mają jeden?
Według tego wątku na Reopening builtin classes, redefining builtin functions?Perlmonks artykule Myślę, że odpowiedź jest nr (przynajmniej w ścisłym znaczeniu tego, co jest MOP).
Najwyraźniej jest tu jakiś pokój do pisania, więc warto napisać pytanie po stronie Perla SO, ponieważ autor Class::MOP
/Moose odpowiada na questions there.
Dzięki za informację, jednak czytając pierwszy link "Reopining builtin classes ..." Wydaje się, że autor naprawdę dostaje dużą ilość jego komentarz do Rubiego jest zły, co podważa jego punkt widzenia. Większość tego, co stwierdza w Ruby jako trudne lub niemożliwe do wykonania, jest w Ruby bardzo łatwe. Chciałbym zobaczyć artykuł o podobnej naturze napisany przez kogoś, kto jest biegły zarówno w Rubim jak i Perlu :) Dzięki! – horseyguy
Jeśli przyjrzysz się bliżej definicji, zobaczysz, że Ruby ma MOP z. Czy jest podobny do tego w CLOS? Nie, CLOS to meta-kolista MOP , która jest świetna (powiedziałabym nawet geniusz), ale nie jest to jedyna prawdziwa metoda, spójrz na Smalltalk. Wdrożenie (powiedzmy podstawowy) MOP Wszystko czego potrzebujesz to, aby zapewnić funkcje, które pozwalają swój czas pracy do:
- Tworzenie lub usuwanie nową klasę
- Utwórz nową właściwość lub metoda
- spowodować klasa dziedziczy z innej klasy ("zmień strukturę klas")
- Wygeneruj lub zmień kod definiujący metody klasy.
I Ruby zapewnia sposób na zrobienie tego wszystkiego.
Na marginesie: autor Class :: MOP ma rację (IMHO), gdy twierdzi, że niektóre z rzeczy, które można zrobić za pomocą MOP z meta-kolą, mogą być trudne w Rubim (DISCLAIMER: Mam zero, zilch, nada Wiedza Perla, więc myślę, że Smalltalk jak MOP vs CLOS jak MOP tutaj), ale większość z nich jest bardzo specyficzna (myślę tutaj o metaclassie) i istnieją sposoby, aby wszystko działało bez nich . Myślę, że wszystko zależy od twojego punktu widzenia, meta-kołowe MOP-y są fajniejsze, ale bardziej po stronie akademickiej i MOP-y o niezmiennym metrum są bardziej praktyczne i łatwiejsze do wdrożenia.
- 1. Czy Ruby ma mkdir -p?
- 2. Czy Ruby/Rails ma odpowiednik ++?
- 3. Czy Ruby ma zmienne atomowe?
- 4. Czy mogę poprosić o kod Iostream, jeśli można go zapisać?
- 5. programowo ustalić, czy dany klejnot jest zainstalowany, a następnie zainstalować go, jeśli nie
- 6. Nie można `syscall.Kill()` a daemonized proces Go
- 7. Czy można ręcznie zaimplementować wiązania kakao?
- 8. Czy szybki ma protokół do zapisywania strumienia bajtów?
- 9. Jeśli tabela istnieje, upuść, a następnie utwórz go, jeśli nie istnieje, po prostu stwórz go
- 10. lista operatorów ruby, które można przesłonić/zaimplementować
- 11. Wepchnij element do tablicy, jeśli go nie ma (brak duplikatów)
- 12. Czy aiohttp ma ORM?
- 13. Czy Ruby ma wbudowaną funkcję ... while?
- 14. Czy można zawinąć PDO lub rozszerzyć go?
- 15. Czy można podać wyjątek, jeśli dane wejściowe nie są prawidłowe?
- 16. Czy można sprawdzić, czy zmienna js ma wartość d3?
- 17. Jak zaimplementować protokół SSL w Zend MVC
- 18. Sposób sprawdzania, czy element ma trzy określone klasy, a jeśli tak, to czy jest to
- 19. Czy Ruby ma dowolne klasy formatowania liczb?
- 20. Czy można zawęzić ciągłe wyszukiwanie ruby?
- 21. Czy można obj____ sprawdzić, czy klasa ma zmienną __dict__?
- 22. Czy można utworzyć wiązania kryształów dla Ruby?
- 23. Czy można zmienić klasę obiektu Ruby?
- 24. Ustal, czy obraz istnieje w większym obrazie, a jeśli tak, znajdź go, używając Pythona
- 25. Czy jest to jeden argument, czy nie ma go w przypadku bloku Perl 6?
- 26. Czy setNeedsDisplay: NO w ogóle nie ma zastosowania?
- 27. Czy Instagram ma przycisk udostępniania, czy nie?
- 28. Sprawdź, czy sesja jest ustawiona czy nie, a jeśli nie, utwórz ją?
- 29. Jak można rozszerzyć protokół Clojure na inny protokół?
- 30. Czy `int a = 0, b = a` ma niezdefiniowane zachowanie?
to pomaga? http://stackoverflow.com/questions/1061908/scoping-of-open-classes-in-ruby-versus-mop-in-groovy – zengr
Gdzie usłyszałeś termin "Metaobject"? –
@Andrew, CLOS: http://www.lisp.org/mop/concepts.html – horseyguy