您能否向我解释如何编写缩写版的函数文字?
我正在浏览 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
。
为什么?我错过了什么?
答案 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>