【发布时间】:2012-02-21 14:21:31
【问题描述】:
编辑
好的,这里有很好的反馈,让我指出了正确的方向。调用匿名闭包的用例在 Scalatra 路由层中。我有一堆路由,它们按各种类型分组在一起,在这个例子中,是团队共有的请求:
class Router {
type TeamType <: _Controller with _Team
get("""(schedules|rosters|teamresults|teamstats)/\d{8}""".r) {
val clazz :: date = captures
val obj = (clazz match {
case "schedules" => new RosterController
case "rosters" => new ScheduleController
}).asInstanceOf[TeamType]
obj.show(date)
}
}
通过将匹配表达式包装在一个自调用的匿名闭包中,我们避免在每个匹配的情况下附加“FooController.asInstanceOf[TeamType]”,而是在返回的实例上进行类型转换,保持过程中的不变性(即不能“val obj = clazz match {...}”后跟类型转换,因为 obj 已经被验证)
我相信这是在基于字符串类名创建对象实例时可以得到的最简短的形式。当然,话虽这么说,但很可能有一种 FP 方法可以更简洁地完成这项工作......
无论如何,很酷的东西,缺少来自 Groovy 的匿名闭包,现在我发现 Scala 也涵盖了这一点 ;-)
原创
不知道如何在 Scala 中实现这一点。在 Groovy 中,您可以像这样定义和调用匿名闭包:
{String s-> println(s) }("hello")
Scala 中的等价物是什么?另外,除了返回 Unit,如何指定返回类型?
谢谢
【问题讨论】:
-
asInstanceOf的使用是有效的这种情况非常罕见,而且这看起来不像。如果类型归属在此处不起作用,则该语句可能不正确。 -
为什么它不起作用?闭包返回一个对象并将 asInstanceOf 强制转换为所需的类型。我还没有测试,但编译器显示了正确的类型,并提供了预期的自动完成方法。
-
你搞错了:
asInstanceOfnever 导致编译时错误——你明确告诉编译器相信你,即使它认为你错了。如果代码正确,则键入 ascription 就足够了。例外情况是具体化、反序列化和标记特征,以及一些语义可以保证类型本身无法保证的情况。 -
啊,好吧,不知道,+1。在这种情况下,虽然根本不是类型安全的,但除非正则表达式匹配,否则不会处理路由本身;因此我知道我得到了一个长度为 2 的 Seq[String] 来创建 clazz & date vals。像 xml 一样,存在对字符串进行胖指法的可能性,但除此之外我可以忍受它,就像自调用对象工厂一样 ;-)
标签: scala closures invoke anonymous