Function Scala:val foo=(arg:Type)=>;{…}vs.def(arg:Type)={…}

Function Scala:val foo=(arg:Type)=>;{…}vs.def(arg:Type)={…},function,scala,runtime,state,immutability,Function,Scala,Runtime,State,Immutability,有关 我仍然不清楚这两个定义之间的区别: val-foo=(arg:Type)=>{…} def(arg:Type)={…} 据我了解: 1) val版本在编译时绑定一次 创建一个Function1实例 可以作为方法参数传递 2) def版本在每次调用时都会重新绑定 每次调用创建的新方法实例 如果上述情况属实,那么在要执行的操作不依赖于运行时状态的情况下,为什么要选择def版本 例如,在servlet环境中,您可能希望获取连接客户端的ip地址;在这种情况下,您需要使用def,因为在编译时没有连接

有关

我仍然不清楚这两个定义之间的区别:

val-foo=(arg:Type)=>{…}

def(arg:Type)={…}

据我了解:

1) val版本在编译时绑定一次
创建一个Function1实例
可以作为方法参数传递

2) def版本在每次调用时都会重新绑定
每次调用创建的新方法实例

如果上述情况属实,那么在要执行的操作不依赖于运行时状态的情况下,为什么要选择def版本

例如,在servlet环境中,您可能希望获取连接客户端的ip地址;在这种情况下,您需要使用def,因为在编译时没有连接的客户机

另一方面,在编译时,您通常知道要执行的操作,并且可以使用不可变的
valfoo=(i:Type)=>{…}

那么,根据经验,是否应该仅在存在运行时状态依赖时使用defs


感谢您澄清

我不完全清楚您所说的运行时状态依赖性是什么意思。
val
s和
def
s都可以关闭其词法范围,因此以这种方式是无限的。那么Scala中的方法(
def
s)和函数(as
val
s)有什么区别(which)

您可以参数化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
val b = isEuropean(t)
我可以选择声明
isEuropean
,如下所示:

val isEuropean = (_ : Trade).country.region = Europe

后者避免在声明点而不是在使用点创建对象(函数实例)。Scala正在使用点为方法声明创建函数实例。如果我使用了
\uu
语法,就更清楚了

但是,在以下代码中:

trades filter isEuropean
val b = isEuropean(t)

…如果
isEuropean
被声明为
def
,则不会创建此类对象,因此代码的性能可能会更高(如果在非常紧密的循环中使用,其中每最后一纳秒都是临界值)

也许您应该提到,每次将方法
isEuropean
传递给另一个函数/方法时,将创建一个新的函数对象;我最初的解释实际上相当误导。我已经按运行时状态依赖关系编辑了它+1、@oxbow_lakes(感谢链接,一本名副其实的方法与函数选集),我的意思是,如示例所示,“val foo=()=>request.remoteAddress()”将在编译时生成运行时错误,因为没有连接的客户端。您可以在val匿名方法中定义一个lazy val或一个local def来解决问题,但关键是,如果要执行的操作不是(比如说)外部依赖的,那么使用不可变的val函数是一个选项。只是尝试开发一些关于何时使用def method vs.val函数的约定“def是JVM级别的方法”在JVM级别都是
def
s方法吗?函数体中的
def
呢?
def
的语法显然不正确。请修复它,以便我们更好地了解您的意思。@DanielC.Sobral eh?哦,你一定读过链接的帖子了。这个问题与这个线索相关,但并不完全相关。我的意思是,正如我写的,val函数和def方法;特别是val应/可用于def的情况,反之亦然。我曾假设瓦尔是不可变的,更具表现力,但牛津湖的答案表明并非如此;val函数的非参数化也是一个有用的小道消息。社区wiki、val与def的最终指南、性能特征、权衡以及何时使用都非常有用