【发布时间】:2012-06-05 16:35:33
【问题描述】:
与this thread相关
我仍然不清楚这两个定义之间的区别:
val foo = (arg: Type) => {...}def(arg:Type) = {...}
据我了解:
1) val 版本在编译时绑定一次
创建了一个 Function1 实例
可以作为方法参数传递
2) def 版本在每次调用时重新绑定
每次调用都会创建新的方法实例。
如果上述情况属实,那么在要执行的操作不依赖于运行时状态的情况下,为什么还要选择 def 版本呢?
例如,在 servlet 环境中,您可能想要获取连接客户端的 IP 地址;在这种情况下你需要使用一个def,当然在编译时没有连接客户端。
另一方面,您通常知道,在编译时要执行的操作,并且可以使用不可变的val foo = (i: Type) => {...}
那么根据经验,应该只在存在运行时状态依赖时才使用 defs 吗?
感谢澄清
【问题讨论】:
-
def的语法显然不正确。请修复它,以便我们更好地了解您的意思。 -
@DanielC.Sobral 嗯?哦,你一定读过链接的线程。这个问题与该线程有关,但不完全与该线程有关。我的意思是,正如我所写,val 函数与 def 方法;具体来说,val 应该/可以在 def 上使用的情况,反之亦然。我曾假设 val 是不可变的,性能更高,但 Oxbow Lakes 的回答表明并非如此; val 函数的非参数化也是一个有用的花絮。社区 wiki、val 与 def、性能特征、权衡以及何时使用的权威指南将非常有用
标签: function scala runtime state immutability