代码之家  ›  专栏  ›  技术社区  ›  TranquilMarmot

Scala中println中的匿名函数

  •  1
  • TranquilMarmot  · 技术社区  · 11 年前

    假设我们做到了

    object Test {
        def main(args: Array[String]){
            println(() => "2pac")     // passing anon function 
            println((() => "shakur")()) // passing anon function, with empty args
            println(biggie)           // passing named function, no args
        }
    
        def biggie = "smalls"
    }
    

    打印出来

    <function>
    shakur
    smalls
    

    为什么与命名函数具有相同类型签名的匿名函数需要显式的空参数?为什么 biggie 打印时被呼叫,但 2pac 函数没有?

    1 回复  |  直到 11 年前
        1
  •  11
  •   Dan Simon    11 年前

    让我们逐行进行:

    println(() => "2pac")
    

    在这里,您正在向println传递一个函数。请记住,Scala中的函数只是一个对象,所以println只是调用 toString 方法 Function0 类型,它总是输出 <function> (实际上对我来说,它输出 <function0> )

    println((() => "shakur")())
    

    现在您正在调用anon函数,然后将其传递给 println ,所以没有收到 功能0 对象,它接收函数的返回值并仅输出字符串

    println(biggie)
    

    最后,在这里 biggie 不仅仅是 功能0 ,它是一个 零元 函数,这意味着该函数在被引用时执行,并且不明确要求调用 () 。这是因为您定义它时没有参数列表,而不是空的参数列表。所以当你打电话的时候 println(biggie) 这个 大人物 函数被求值,其结果被发送到 打印

    如果你打电话 println(biggie _) ,下划线告诉编译器 来评估函数,而不是将函数本身传递给 打印 同样,如果您定义 大人物 作为:

    def biggie() = "smalls"
    

    当你打电话时 印刷字体(大字体) 然后它的行为与传递一个0-arg-anon函数相同。