Groovy<<<操作员很困惑

时间:2014-11-03 15:29:21

标签: groovy bitwise-operators

我是Groovy的新手,我对<<运算符非常失落。我理解它用作移位器如下:

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

但是,在字符串中使用闭包时,运算符还有另一种用途:

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

所以我的问题是:<<在什么情况下充当赋值运算符?在什么情况下它会变得有点移动?

这第二个例子让我感到困惑:

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

似乎<<执行追加。那么<<有一套规则吗? <<对每个数据结构的行为都不同吗?某处有一套编纂的规则吗?我似乎无法在Groovy文档中找到任何内容;相反,它在不同的例子中被随意抛出,这充其量令人困惑。

2 个答案:

答案 0 :(得分:3)

在Groovy中,<<是一个可以为各种类重载的运算符,因此它具有不同的行为,具体取决于使用它的上下文。有关详情,请参阅the docsanother SO answer

在您提供的示例中,代码的工作方式如下:

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

这是一个普通的旧位移。在DefaultGroovyMethods class(其中定义了大多数花式方法)中,leftShift方法重载了Number,通过NumberMath然后通过{{ {3}},操作。

在第二种情况下:

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

除了使用IntegerMathIOGroovyMethods类之外,它的工作原理类似。

在最后一种情况下:

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

再次使用课程InvokerHelper

您甚至可以在自定义类中覆盖运算符:

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

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

答案 1 :(得分:1)

<<是一个类型可以定义的运算符:

http://docs.groovy-lang.org/docs/next/html/documentation/core-operators.html#Operator-Overloading

集合,例如,重载leftShift,将其用作追加操作。