【发布时间】:2012-07-09 08:53:40
【问题描述】:
我喜欢这种方式,您可以在 Scala 中编写单行方法,例如与List(1, 2, 3).foreach(..).map(..)。
但有一种情况,有时会在编写 Scala 代码时出现,这会让事情变得有点难看。示例:
def foo(a: A): Int = {
// do something with 'a' which results in an integer
// e.g. 'val result = a.calculateImportantThings
// clean up object 'a'
// e.g. 'a.cleanUp'
// Return the result of the previous calculation
return result
}
在这种情况下我们必须返回一个结果,但不能在计算完成后直接返回,因为我们必须在返回之前做一些清理工作。
我总是要写三行。是否也有可能写一个单行来做到这一点(不改变A的类,因为这可能是一个无法改变的外部库)?
【问题讨论】:
-
如果'a'上的操作总是一样的,为什么不把它们包装成一个函数呢?
-
除了 Vinc 的评论:单行代码不能很好地处理命令式代码。
-
你的介绍性例子是错误的:你不能做
List(1, 2, 3).foreach(..).map(..),因为foreach返回Unit。另外我想补充一下 ziggystar 的评论:在编写命令式代码的同时寻找单行代码是错误的,而且会让你一事无成,因为它完全违反了命令式编程范式的本质。 -
您需要一些库来扩展功能组合。就像 Python 的 PEAK 库一样。我已经搜索了一个,但没有找到。也许你会很幸运
-
这个问题的厚颜无耻的答案是只使用分号将其塞进一行:
def foo(a : A): Int = { val result = a.calculateImportantThings; a.cleanup; result }。我的意思是,这就是分号的用途,对吧?通过对副作用进行排序来组合副作用。
标签: scala