你如何写缩写版的函数文字?

时间:2013-05-02 03:48:51

标签: scala scala-2.10 spray

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

我正在浏览 this 喷涂教程,其中包含以下代码

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

为什么?我错过了什么?

2 个答案:

答案 0 :(得分: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语法。

答案 1 :(得分: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>