是否可以在不声明类的情况下创建对象?就像在JavaScript中一样
obj = {a: '1'}; console.log(obj.a)
答案 0 :(得分:69)
在Groovy中,您必须始终提供正在创建的对象的类,因此Groovy中没有等效的JavaScript对象 - 文字语法。
但是,Groovy确实有一个Map
的文字语法,它在概念上与JavaScript对象非常相似,即两者都是属性或名称 - 值对的集合。
上面JavaScript的等效Groovy代码是:
def obj = [a: '1']
println obj.a
即使这里没有使用类名,你仍然在创建一个特定类的对象(java.util.LinkedHashMap
)。上面的代码只是简写:
def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
Expando
class可能更类似于JavaScript对象,当你想要避免定义一个类的“开销”,或者想要一个可以添加任意属性的动态对象时,它很有用。运行时。
答案 1 :(得分:27)
有人没有提到过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")
打印输出:
DEF
ABC
groovy.lang.MissingPropertyException
ABC(如果你在map.run中注释掉println($ a),println($ b)打印出ABC)
忽略输出中的额外换行符。有一段时间把def和ABC放在连续的线上。
有关详细信息,请参阅Expando API documentation。
答案 2 :(得分:1)
Groovy具有json的等效符号。唯一的区别是,它们将[:]用于地图而不是{}。因此,您可以清楚地将json转换为常规对象表示法。
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)
这里我没有直接打印对象。由于它将以方括号符号打印。
阅读全文。适用于javascript开发人员的Groovy。 https://metamug.com/article/groovy-for-javascript-developers.php
答案 3 :(得分:0)
您可以使用literal map:
config = [
host : '0.0.0.0',
user : 'user1',
password: 'pass'
]
println("""
HOST: ${config.host}
USER: ${config.user}
PASS: ${config.password}
""")
您还可以返回文字映射作为函数返回值,而不必定义自定义类,例如
return [status: 200, body: 'abcdef']
,然后在调用方中访问值,例如与response.status
。