[英]Scala: val foo = (arg: Type) => {…} vs. def(arg:Type) = {…}
与此主题相关
我仍然不清楚这两个定义之间的区别:
val foo = (arg: Type) => {...}
def(arg:Type) = {...}
据我了解:
1)val版本在编译时绑定一次
创建一个Function1实例
可以作为方法参数传递
2)def版本在每次调用时都会重新绑定
每次调用创建的新方法实例。
如果上述情况属实,那么为什么在要执行的操作不依赖于运行时状态的情况下会选择def版本?
例如,在servlet环境中,您可能希望获取连接客户端的IP地址; 在这种情况下,您需要使用def作为,当然在编译时没有连接的客户端。
另一方面,你经常在编译时知道要执行的操作,并且可以使用不可变的val foo = (i: Type) => {...}
根据经验,当存在运行时状态依赖时,是否应该只使用defs?
谢谢你的澄清
关于运行时状态依赖的含义,我并不完全清楚。 val
和def
都可以关闭它们的词法范围,因此这种方式是无限的。 那么Scala中的方法( def
s)和函数(作为val
s)之间有什么区别( 之前已经被问过和回答过 ) ?
例如:
object List {
def empty[A]: List[A] = Nil //type parameter alllowed here
val Empty: List[Nothing] = Nil //cannot create a type parameter
}
然后我可以打电话:
List.empty[Int]
但我必须使用:
List.Empty: List[Int]
但当然还有其他原因。 如:
如果我要使用这段代码:
trades filter isEuropean
我可以选择isEuropean
的声明:
val isEuropean = (_ : Trade).country.region = Europe
要么
def isEuropean(t: Trade) = t.country.region = Europe
后者避免在声明点创建对象(对于函数实例),但不在使用点创建 。 Scala正在为使用点的方法声明创建一个函数实例。 如果我使用_
语法更清楚。
但是,在下面的代码中:
val b = isEuropean(t)
...如果isEuropean
被声明为def
,则不会创建这样的对象,因此代码可能更isEuropean
(如果在非常紧密的循环中使用,其中每个最后纳秒具有临界值)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.