2014-11-03 104 views
1

我是groovy的新手,我對'< <'運營商非常失望。我理解它是作爲一個bitshifter按如下方式使用:groovy <<令人困惑

def x = 2 
x << 2 //x == 8 

然而,bitshifter具有當封閉使用字符串中的另一個用途:

"${ w -> w << 3}" //w == 3 

所以我的問題是:在什麼情況下呢'< <'充當賦值運算符?它在什麼情況下起到了一些障礙?

這第二個例子是真的是什麼讓我困惑:

def transform(List elements, Closure action) {      
    def result = [] 
    elements.each { 
     result << action(it) 
    } 
    result 
} 

這似乎< <的作用類似於追加。那麼是否有一套關於'< <'的規則?對於每個數據結構,'< <'的行爲是否有所不同?有沒有一套規範的法規?在groovy的文檔中,我似乎無法找到任何關於此的內容,而是隨便拋入其中,在不同的示例中,這充分混淆了。

+2

你的轉換也可以寫成'元素。收集{action(it)}',這樣會更容易混淆;) – cfrick 2014-11-03 18:36:57

+1

快速規則:只要你看到'x << y',就認爲它是'x.leftShift(y)'那麼這只是理解任何'x'類型的JavaDocs都是。 – bdkosher 2014-11-03 20:36:18

+0

我可以理解爲什麼它可能有點令人困惑,但它確實有道理。將'<<'運算符看作調用'leftShift'方法的簡寫。 'leftShift'方法在不同的類中可能會做出根本不同的事情。這類似於調用'java.util.ArrayList'上的'add'方法與調用'java.math.BigDecimal'上的'add'方法。這些是根本不同的類型,在這兩種情況下,「添加」意味着不同的事物。我希望有所幫助。 – 2014-11-03 21:02:20

回答

3

在常規<<是可以被重載關於各種類,以便它具有根據上下文不同的行爲,其中它被使用時,看到其他的答案爲here文檔和here的操作員。

在您所提供的例子是作品如下:

def x = 2 
assert x << 2 == 8 

這是普通的老位移位。在DefaultGroovyMethods類(其中大多數花式方法被定義)爲Number方法重載,其中通過NumberMath,然後通過IntegerMath做的操作。

在第二種情況:

assert "${ w -> w << 3}" == '3' 

它的工作原理相似,只是IOGroovyMethodsInvokerHelper類使用的事實。

在最後一種情況:

def transform(List elements, Closure action) {      
    def result = [] 
    elements.each { 
     result << action(it) 
    } 
    result 
} 

DefaultGroovyMethods類再次被使用。

你甚至可以在自定義的類中重寫操作:

class Lol { 
    def leftShift(o) { 
     println o 
    } 
} 

new Lol() << 'string' //prints 'string' 
+1

'$ {w-> w << 3}'真的讓我感到困惑 – cfrick 2014-11-03 20:00:31

+0

確實。我仍然不完全確定那裏會發生什麼。 – Opal 2014-11-03 20:07:12