【问题标题】:Scala: val foo = (arg: Type) => {...} vs. def(arg:Type) = {...}Scala: val foo = (arg: Type) => {...} vs. def(arg:Type) = {...}
【发布时间】: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


【解决方案1】:

我并不完全清楚您所说的运行时状态依赖是什么意思。 vals 和 defs 都可以关闭它们的词法范围,因此以这种方式不受限制。那么Scala中的方法(defs)和函数(如vals)有什么区别(其中has been asked and answered before

你可以参数化一个def

例如:

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]

当然还有其他原因。如:

def 是 JVM 级别的方法

如果我要使用这段代码:

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被传递给另一个函数/方法时,都会创建一个新的函数对象。
  • 好点;事实上,我最初的解释实际上是相当具有误导性的。我已经编辑过了
  • +1,@oxbow_lakes(感谢链接,名副其实的方法与功能选集)
  • 运行时状态依赖性我的意思是作为提供的示例,“val foo = () => request.remoteAddress()”会生成运行时错误,因为在编译时没有连接的客户端。您可以在 val 匿名方法中定义一个惰性 val 或者可能是一个本地 def 来解决问题,但关键是,如果要执行的操作不是,比如说,外部依赖,那么使用不可变 val 函数,是一种选择。只是想为何时使用 def 方法与 val 函数制定一些约定
  • "A def 是 JVM 级别的方法" 都是 JVM 级别的 defs 方法吗?函数体内的def 怎么样?
猜你喜欢
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2012-04-25
  • 2014-03-20
  • 2018-10-01
  • 2018-08-15
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多