This question already has answers here:
What is the purpose of “<<” (double less than) in groovy

(2个答案)


5年前关闭。




我正在尝试阅读一些常规知识,并在几种情况下遇到了“两倍以下”的<<。很难谷歌。在这些示例中它如何工作?
new URL('the url').withInputStream{ i -> f.withOutputStream{ it << i }}

在Gradle中:
task hello << {
  println 'Hello world!'
}

最佳答案

在常规Java(以及几乎其他任何地方)中,这意味着数字按位左移:

assert (1<<4)==16

但是Groovy允许使用overloading operators,并且在上述示例中,它意味着(使用a.leftShift(b)方法的)重载了什么。像在C++中一样,它通常用于表示“附加”操作(例如std::cout << "Hello World" << std::endl)。

在上面的示例中,这意味着“附加流”(请参阅​​https://github.com/groovy/groovy-core/blob/GROOVY_2_4_X/src/main/org/codehaus/groovy/runtime/IOGroovyMethods.java#L113)或“将此功能/闭包添加到任务中”(请参见https://github.com/gradle/gradle/blob/RB_2.0/subprojects/core/src/main/groovy/org/gradle/api/internal/AbstractTask.java#L460)。

还有例如<<将项目追加到常规列表中(例如def list = []; list << 42)。

如果您想自己使用它,则基本上可以使用它来做任意的事情。在以下示例中,“在cnt中添加五个”
class X {
    def cnt = 0
    def leftShift(x) {
        cnt += 5
    }
}

def x = new X()
x << "lol"
assert x.cnt == 5

是聪明吗?也许不会。您很可能会添加经常需要的功能,这对运算符(operator)来说很有意义。并注意<<运算符的优先级!

09-26 01:01
查看更多