Groovy 方法调用语法

Groovy method call syntax

教程 here 说:

Method calls in Groovy can omit the parenthesis if there is at least one parameter and there is no ambiguity.

这个有效:

static method1(def val1)
{
    "Statement.method1 : $val1"
}

def method1retval = method1 30; 
println (method1retval);  //Statement.method1 : 30

但是当我向方法添加另一个参数时:

static method1(def val1, def val2)
{
    "Statement.method1 : $val1 $val2"
}
def method1retval = method1 30 "20";
println (method1retval);

报错

Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: static Statements.method1() is applicable for argument types: (java.lang.Integer) values: [30]
Possible solutions: method1(int, java.lang.String)

Q. 那么方法调用中有多个参数时,不能省略括号吗?

Q. 还有调用class构造函数时可以省略括号吗?

那么电话是method1 30, "20"。文档说您可以省略 ( 和 ) 但不能省略 ,。在您的情况下,代码将被解释为 method1(30)."20"(执行下一个调用)。

对于一般的构造函数,同样的规则适用。但通常它们与 new 一起使用,这不起作用。

class A {
    A() { println("X") }
    A(x,y) { println([x,y]) }
}

// new A // FAILS
// new A 1,2 FAILS

A.newInstance 1,2 // works

new 周围的错误表明,( 是预期的,并且它们在解析时已经失败。 new 是关键字并具有特殊行为。

实际上,这一切都归结为:避免 () 使代码更好(或更短,如果你打高尔夫球的话)。它的主要用途是用于 "DSL",您只需将代码转换为可读的句子(例如 select "*" from "table" where "x>6" 或在 grails 中 static constraints { myval nullable: true, min: 42 })。