2013-06-10 1 views
5

Идущие следующие в 1,8 консоли:почему неожиданный маркер: * в при выполнении операции над двумя линиями

def accessories = null 
final int prime = 31; 
int result = 1; 
result = prime 
    * result 
     + ((accessories == null) ? 0 : accessories 
       .hashCode()); 

Я получаю ошибку компиляции, заявив:

неожиданный маркер: * в строке: 5, столбец: 13

Тем не менее, когда я перемещаю «результат» до предыдущей строки, он компилируется и работает чисто. Я искал, чтобы попытаться найти объяснение, но до сих пор не повезло. Может кто-нибудь объяснить?

def accessories = null 
final int prime = 31; 
int result = 1; 
result = prime * result 
     + ((accessories == null) ? 0 : accessories 
       .hashCode()); 

ответ

6

Поскольку заявления Groovy не разделены ;, а скорее разрывом строки. Он не может знать, что приведенная ниже строка является продолжением утверждения на приведенной выше строке. Вы можете избежать разрыва строки:

int i = 10 \ 
    * 9 
assert i == 90 

Update:

На самом деле Groovy делает определить некоторые заявления, как из предыдущей строки. По крайней мере, точка признается:

assert [1, 2] 
    .join("") 
    .padLeft(4, "a") == "aa12" 

И заявление ни с одним +, - и ~ (а может и больше) could be methods:

def m = "aa" 
    - m // fails with "No signature of method: java.lang.String.negative()" 
+1

Вы просто ударили ноготь по голове. :-) – dmahapatro

2

Вам просто нужно переместить * вместо перемещения * result к строке 4.

result = prime //Line completes with the assignment of prime to result 
     * result //Will yield a compilation error 
      + ((accessories == null) ? 0 : accessories 
        .hashCode()); 

Вместо

result = prime * //Statement expects a RHV (right hand value) for the operator 
      result + //Always end the line with an operator 
      ((accessories == null) ? 0 : accessories 
        .hashCode()); 

Чтобы проверить то же самое с ternary оператора,

//Yields to compilation error 
def str = "ABC"    
def val = str == "ABC" 
? str 
: "XYZ" 

//Works perfect 
def val = str == "ABC" ? 
str : 
"XYZ" 
+1

Это был не мой вопрос. Мой вопрос: «Почему это необходимо», а не как его разрешить. Я уже это сделал. В любом случае, спасибо за отзыв. –

+0

@BillTurner «Почему это необходимо» упоминается как комментарии в соответствующих строках. – dmahapatro

3

Это необходимо, поскольку в противном случае анализатор для Groovy бы делать намного больше работы.

Есть много мест, то есть:

String s = "tim" 
      + "_yates" 

Где можно было бы для синтаксического анализа работать, что вы имели в виду, но во всех из них, я считаю, что это будет включать backtracking (или реализации двух pass parse), который медленный

+0

+1, не знал о возврате в парсерах ... Я также не знаю много о парсерах, а также :-) – Will

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