2

您能否向我解释一下如何编写函数文字的缩短版本?

我正在阅读这个Spray 教程,其中包含以下代码

val route: Route = { ctx => ctx.complete("yeah") }

被压缩到

val route: Route = complete("yeah")

其中complete是 RouteDirectives 的功能。

我无法在我的代码中重现相同的内容

class Test
{
  def testFunc(value : Int) {
    println(value)
  }
}

type MyType = Test => Unit
val asd : MyType = _.testFunc(10)
asd(new Test)

如果我val asd : MyType = testFunc(10)改为写,我(显然)会出错

error: type mismatch;
found   : Int(10)
required: Int => Unit
val asd : MyType = testFunc(10)

所以我想也许“完整”也是一个有apply方法的对象。确实有以下作品

val route: Route = complete.apply("yeah")

但我没有看到一个物体。在调试器中,它按RouteDirectives.complete预期进入。

为什么 ?我错过了什么?

4

2 回答 2

4

complete返回一个函数。当您调用 时complete("yeah"),您正在"yeah"为该函数提供参数(他们称其为磁铁)。

所以要做类似的事情,你会写:

def testFunc: Int => Unit = (i: Int) => println(i)

将它与在对象上调用方法放在一起Test

def testFunc: Int => (Test => Unit) = (i: Int) => {
  (test: Test) => println(i)
}

由于=>关联到正确和类型推断的方式,可以重写:

def testFunc: Int => Test => Unit = i => test => println(i)

然后它要么非常混乱,要么很自然(参数完全反映了类型)。

因此,当在教程中他们说它是等价的时,库的作者会花一些时间通过返回函数使其看起来像是“等价的”,这不是 Scala 语法中内置的东西。

于 2013-05-02T05:14:06.753 回答
0

我认为您的代码中有格式错误。当我第一次将您的代码粘贴到 REPL 中时,“class Test”之后的新行导致下一个块被视为一个完全独立的块。你在 REPL 中执行了吗?以下对我有用:

scala> class Test { def testFunc(i: Int) { println(i) } }
defined class Test

scala> type MyType = Test => Unit
defined type alias MyType

scala> val asd : MyType = { t => t.testFunc(10) }
asd: Test => Unit = <function1>

scala> val asd : MyType = { _.testFunc(10) }
asd: Test => Unit = <function1>

scala> val asd : MyType = _.testFunc(10)
asd: Test => Unit = <function1>
于 2013-05-02T05:09:17.907 回答