Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 是否可以在不声明类的情况下创建对象?_Groovy - Fatal编程技术网

Groovy 是否可以在不声明类的情况下创建对象?

Groovy 是否可以在不声明类的情况下创建对象?,groovy,Groovy,是否可以在不声明类的情况下创建对象?就像JavaScript一样 obj={a:'1'};log(obj.a)在Groovy中,必须始终提供要创建的对象的类,因此Groovy中没有与JavaScript的对象文本语法等价的语法 然而,Groovy确实有一个映射的文本语法,它在概念上非常类似于JavaScript对象,即两者都是属性或名称-值对的集合 与上述JavaScript等效的Groovy代码是: def obj = [a: '1'] println obj.a 即使这里没有使用类名,您仍

是否可以在不声明类的情况下创建对象?就像JavaScript一样
obj={a:'1'};log(obj.a)

在Groovy中,必须始终提供要创建的对象的类,因此Groovy中没有与JavaScript的对象文本语法等价的语法

然而,Groovy确实有一个
映射
的文本语法,它在概念上非常类似于JavaScript对象,即两者都是属性或名称-值对的集合

与上述JavaScript等效的Groovy代码是:

def obj = [a: '1']
println obj.a
即使这里没有使用类名,您仍然在创建特定类的对象(
java.util.LinkedHashMap
)。上面的代码只是以下内容的简写:

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

当您想要避免定义类的“开销”,或者想要在运行时添加任何任意属性的动态对象时,它可能更类似于JavaScript对象,并且非常有用。

对于没有人提到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放在连续的线路上是一段非常艰难的时间


有关更多信息,请参见。

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)
这里我没有直接打印对象。因为它将使用方括号表示法打印

阅读整篇文章。面向javascript开发人员的Groovy。

您可以使用:

您还可以将文字映射作为函数返回值返回,而无需定义自定义类,例如
return[status:200,body:'abcdef']
,然后在调用者中访问值,例如使用
response.status


伟大的发现!著名的Haki先生也写过关于Expando类的文章:我想说Expando类实际上是对所问问题的回答。使用Expando是正确的答案。使用Maps作为一个动画对象更像是一种黑客行为。我注意到,如果您有一个属性“name”,并使用“$name”,它将选择顶级的name属性,可能是类名,而不是Expando的name属性。您还可以使用此语法创建一个空映射:def obj=[:]有趣。如果你想知道的话,可以在
LinkedHashMap
中使用数组/列表。例如,这是有效的:
def obj=[a:[1,2,“foo”];obj.a.推力(“杆”)
config = [
        host    : '0.0.0.0',
        user    : 'user1',
        password: 'pass'
]

println("""
HOST: ${config.host}
USER: ${config.user}
PASS: ${config.password}
""")