传递匿名函数作为参数

时间:2016-09-23 13:52:15

标签: scala

我是Scala的新手。 我从另一个JVM语言导入函数,帮助器向我显示这个签名

enter image description here

让我感到困惑。 在原始语言中,我设计的功能就像这样工作

dsl {
   method { }
   header { }
}

但是Scala会是什么样子?

另一种语言dsl看起来像这样

class GRLMessageDSL : GRLMessage() {

    fun dsl(closure: GRLMessageDSL.() -> Unit) : GRLMessage {
        closure()
        return this
    }

    fun method(closure: GRLMessageDSL.() -> GRLProtocol.GRLMethod) : GRLMessage {
        methodType = closure()
        return this
    }

    fun headers(closure: GRLMessageDSL.() -> Unit) : GRLMessage {
        closure()
        return this
    }

    fun header(closure: GRLMessageDSL.() -> Pair<String, String>) : GRLMessage {
        headerMap += closure()
        return this
    }

    fun multipart(closure: GRLMessageDSL.() -> IGRLMultipart) : GRLMessage {
        multipartObject = closure()
        return this
    }

1 个答案:

答案 0 :(得分:0)

带有一个输入参数的匿名函数或lambda被编译到Scala中的Function1接口,这就是为什么你看到Function1

这意味着

val f = {x: Int => x * x } (this is just syntactic suger)

上述函数相当于(实际编译为)

new Function1[Int, Int] { def apply(x: Int) = x * x }

Scala REPL

scala> val f = {x: Int => x * x }
f: Int => Int = <function1>

scala> new Function1[Int, Int] { def apply(x: Int) = x * x }
res1: Int => Int = <function1>