Подтвердить что ты не робот

Можно ли создать объект без объявления класса?

Можно ли создать объект без объявления класса? Как в JavaScript obj = {a: '1'}; console.log(obj.a)

4b9b3361

Ответ 1

В Groovy вы всегда должны предоставлять класс создаваемого объекта, поэтому в синтаксисе объекта-литерала JavaScript нет эквивалента в Groovy.

Однако Groovy имеет литеральный синтаксис для Map, который концептуально очень похож на объект JavaScript, т.е. оба представляют собой набор свойств или пар имя-значение.

Эквивалентный код Groovy для приведенного выше JavaScript:

def obj = [a: '1']
println obj.a

Даже если имя класса не используется здесь, вы все равно создаете объект определенного класса (java.util.LinkedHashMap). Вышеприведенный код просто сокращен для:

def obj = new LinkedHashMap();
obj.a = '1'
println obj.a

Expando class, возможно, даже больше похож на объект JavaScript, и полезен, когда вы хотите избежать "накладных расходов" определение класса или динамический объект, к которому любое произвольное свойство может быть добавлено во время выполнения.

Ответ 2

Чуть удивился, что никто не упомянул класс Expando. Это добавляет дополнительную функциональность над картой, поскольку вы можете напрямую ссылаться на свойства в своих функциях. Пример кода ниже.

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")

печатный вывод:

Защита

ABC

groovy.lang.MissingPropertyException

ABC (если вы закомментируете println ($ a) в map.run, println ($ b) выводит ABC)

Игнорировать дополнительные прерывания строки на выходе. Было чертовски время, накладывая def и ABC на последовательные строки.

edit: ссылка Api

http://groovy.codehaus.org/api/groovy/util/Expando.html