我是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文档中找到任何内容;相反,它在不同的例子中被随意抛出,这充其量令人困惑。
答案 0 :(得分:3)
在Groovy中,<<
是一个可以为各种类重载的运算符,因此它具有不同的行为,具体取决于使用它的上下文。有关详情,请参阅the docs和another SO answer。
在您提供的示例中,代码的工作方式如下:
def x = 2
assert x << 2 == 8
这是一个普通的旧位移。在DefaultGroovyMethods
class(其中定义了大多数花式方法)中,leftShift
方法重载了Number
,通过NumberMath
然后通过{{ {3}},操作。
在第二种情况下:
assert "${ w -> w << 3}" == '3'
除了使用IntegerMath
和IOGroovyMethods
类之外,它的工作原理类似。
在最后一种情况下:
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
,将其用作追加操作。