2015-02-13 7 views
1

обучающей here говорит:Groovy вызова методы Синтаксис

Метод вызовы в Groovy можно опустить скобки, если есть хотя бы один параметр, и нет никакой двусмысленности.

Это работает:

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. Так косяк I опустить круглые скобки, когда havin g более одного параметра в вызове метода?

Q. Также можно опустить скобки при вызове конструктора классов?

ответ

6

звонок затем 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 показывают, что (, как ожидается, и что они уже не в состоянии в parsetime. new - это ключевое слово и имеет особое поведение.

В действительности все это сводится к: избегая (), чтобы сделать код более приятным (или короче, если вы кодируете код). Это основное использование для «DSL», где вы просто превращаете код в читаемые предложения (например, select "*" from "table" where "x>6" или в grails static constraints { myval nullable: true, min: 42 }).

+0

ohh stupid Я, но как насчет конструктора? – Mahesha999

+0

, если вы можете назвать это «без двусмысленности», да. но с 'new ...' ни 'new A', ни' new A 1', ни 'new A 1, 2' работают. если вам нужно это для DSL, подумайте об использовании построителя. прикомандированные вызовы с одним параметром работают хорошо с отсутствием(), а строители/беглый apis вполне соответствуют этому. – cfrick

+0

, но 'new A 1," 2 "' также не работает и нет двусмысленности, '1'' '' '' '' '' '' '' String'. Получение 'Groovy: expecting '(' или '[' после названия типа для продолжения нового выражения – Mahesha999

Смежные вопросы