Czy można utworzyć obiekt bez deklarowania klasy? Podobnie jak w JavaScript obj = {a: '1'}; console.log(obj.a)
Czy można utworzyć obiekt bez deklarowania klasy?
Odpowiedz
W Groovy musisz zawsze podać klasę tworzonego obiektu, więc nie ma odpowiednika w Groovy do dosłownej składni JavaScript.
Jednak Groovy ma literalną składnię dla Map
, która jest koncepcyjnie bardzo podobna do obiektu JavaScript, tj. Obie są zbiorem właściwości lub par nazwa-wartość.
Odpowiednik kodu Groovy do JavaScriptu powyżej jest:
def obj = [a: '1']
println obj.a
Choć nie ma nazwy klasy stosowane tu jesteś jeszcze tworzenia obiektu danej klasy (java.util.LinkedHashMap
). Powyższy kod jest tylko skrótem:
def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
Expando
class jest chyba jeszcze bardziej podobny do obiektu JavaScript i jest przydatna, gdy chcemy uniknąć „overhead” definiowania klasę, lub chcą dynamicznego obiektu do którą dowolną dowolną właściwość można dodać w czasie wykonywania.
Lekko zaskoczony, że nikt nie wspomniał o klasie Expando. Zapewnia to dodatkową funkcjonalność na mapie, dzięki czemu możesz bezpośrednio odwoływać się do właściwości w ramach swoich funkcji. Przykład kodu poniżej.
def expando = new Expando(a:"def")
expando.run = {def b ->
println("$a")
println("$b")
}
expando.run("ABC")
def map = [a:"def"]
map.run = {def b ->
println("$a") //THIS DOES NOT WORK. You will get a missing property exception.
println("$b")
}
map.run("ABC")
wydruk:
def
ABC
groovy.lang.MissingPropertyException
ABC (jeśli zakomentuj println ($ a) w map.run , println ($ b) wypisuje ABC)
Zignoruj dodatkowe łamania linii na wyjściu. Miałem sporo czasu stawiając def i ABC na kolejnych liniach.
edit: Api Link
Świetne znalezisko! Znakomity pan Haki napisał również o klasie Expando: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Powiedziałbym, że klasa Expando jest rzeczywiście odpowiedź na pytanie. – Henrik
- 1. Czy można utworzyć obiekt bez klasy w języku C#?
- 2. php utworzyć obiektu bez klasy
- 3. Czy mogę utworzyć zmienną globalnie widoczną bez konieczności deklarowania jej globalnie w każdym konstruktorze klasy PHP?
- 4. Czy można generic generatora bez generowania klasy?
- 5. Czy można utworzyć obiekt wielokropka (`...`) od podstaw?
- 6. Czy można utworzyć instancję klasy bez uruchamiania ŻADNEGO kodu z klasy? (brak inicjalizacji, brak inicjalizacji pól)
- 7. Czy można utworzyć kontekst OpenGL bez otwierania okna?
- 8. Czy można utworzyć przezroczyste płótno?
- 9. Czy można utworzyć klasę pochodną z konstruktora klasy podstawowej?
- 10. Intelli-J: nie można utworzyć pliku klasy?
- 11. czy można utworzyć wyzwalacz bez procedury wykonywania w postgresql?
- 12. Czy można utworzyć aplikację na iPhone'a bez produktów Apple?
- 13. Czy można utworzyć subskrypcję SNS z CloudFormation bez tworzenia tematu?
- 14. Nie można utworzyć wystąpienia błędu klasy błędu
- 15. Czy można animować obiekt UII?
- 16. Nie można utworzyć rozszerzenia bez roli administratora
- 17. Nie można utworzyć QWidget bez QApplication
- 18. utworzyć obiekt JQuery, przekazując obiekt DOM?
- 19. Utwórz niezmienny obiekt, utworzony bez nowego
- 20. Czy można zadeklarować obiekt constexpr initializer_list?
- 21. Jaki jest cel nowego() podczas deklarowania klasy ogólnej?
- 22. Czy można utworzyć wektor bitsets?
- 23. Czy można utworzyć alias szablonu?
- 24. Czy można utworzyć wektor wskaźników?
- 25. Dlaczego java udostępnia obiekt do deklarowania interfejsu wewnątrz interfejsu
- 26. Jak utworzyć obiekt klasy w Lua-C API 5.2?
- 27. Dowolny sposób deklarowania struktury klasy gniazdowej w maszynopisie?
- 28. Jak zadeklarować obiekt inline z zmiennych inline bez klasy nadrzędnej
- 29. Dlaczego nie można utworzyć pary z konstruktorem kopii "non const", skoro można go utworzyć bez niego?
- 30. Deklaracja konstruktora klasy ... Dwa sposoby deklarowania tego samego?
można również użyć tej składni, aby utworzyć pustą mapę: def obj = [:] – Hudson
Interesujące. W przypadku, gdybyś się zastanawiał - dozwolone jest używanie tablic/list wewnątrz 'LinkedHashMap'. Na przykład. to działa: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux