2013-06-10 24 views
5

üzerinde çalışmasını yaparken de:neden Beklenmeyen belirteç: * Bir 1.8 konsolunda aşağıdaki Running iki satır

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

Ben belirten bir derleme hatası alıyorum:

beklenmedik belirteç: * satırında: 5, sütun: "* sonucu" bir önceki satıra taşıdığımda, derhal temizler ve çalıştırır. Bir açıklama bulmaya çalıştım ama şimdiye kadar şansım olmadı. Birisi açıklayabilir mi?

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

cevap

6

Groovy'nin ifadeleri, ; tarafından sınırlandırılmadığı için satır aralığına göre ayrılır. Aşağıdaki satırın yukarıdaki satırdaki ifadesinin devamı olduğunu bilemez. Sen satır sonu kaçabilir:

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

Güncelleme:

Aslında Groovy yukarıdaki satırından gibi bazı ifadeleri aynen yapar. En azından nokta tanınır:

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

Ve bir açıklama ya +, - ve ~ (ve belki de daha fazla) could be methods:

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

Sadece kafasındaki çiviye vurdun. :-) – dmahapatro

2
Sadece Yerine 4.

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

satıra yerine * result hareketli * taşımak gerekir

,

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 operatörle aynı test etmek

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

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

Bu benim sorum değildi. Sorum şu: "neden bu gerekli" nasıl çözüleceği değil. Bunu zaten anladım. Yine de geribildirim için teşekkürler. –

+0

@BillTurner "Neden gerekli" ifadesi ilgili satırlarda yorum olarak belirtilmiştir. – dmahapatro

3

Groovy için aksi ayrıştırıcı olurdu, çünkü bu gereklidir daha çok iş yap. ayrıştırıcı ne anlama geldiğini çalışmak için

String s = "tim" 
      + "_yates" 

mümkün olması halinde, ancak bunların hepsi de, ben backtracking dahil olacağına inanıyorum (veya ikisini uygulayan: yerlerde bir sürü vardır

yani parse) yavaş olan

+0

+1, ayrıştırıcılarda ayrıştırma hakkında bir şey bilmiyordum ... Ayrıca, ayrıştırıcıları hakkında da çok şey bilmiyorum :-) – Will

İlgili konular