Можно ли создать объект без объявления класса? - PullRequest
56 голосов
/ 16 февраля 2012

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

Ответы [ 3 ]

70 голосов
/ 16 февраля 2012

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

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

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

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

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

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

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

27 голосов
/ 17 февраля 2012

Немного удивлен, что никто не упомянул класс 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 в последовательные строки.

См. Документацию Expando API для получения дополнительной информации.

1 голос
/ 16 августа 2018

Groovy имеет эквивалентную запись для json.Разница лишь в том, что они используют [:] для карт вместо {}.Таким образом, вы можете четко преобразовать JSON в обозначение Groovy объекта.

import groovy.json.JsonOutput

def obj = [:] //define map
obj.batsmen = [] //define array 
def b = [:] 
b.name= "V. Kohli"
b.score = 55
b.strike = false

obj.batsmen.push(b)

//push second object
obj.batsmen.push(b)
println JsonOutput.toJson(obj)

Здесь я не печатал объект напрямуюТак как он будет печататься с квадратными скобками обозначения.

Прочитать всю статью.Groovy для разработчиков JavaScript.https://metamug.com/article/groovy-for-javascript-developers.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...