在Scala REPL中使用'val'和'def'进行函数定义的区别是什么?
我在Scala REPL中定义了两个函数(方法):在Scala REPL中使用'val'和'def'进行函数定义的区别是什么?,scala,functional-programming,Scala,Functional Programming,我在Scala REPL中定义了两个函数(方法): scala> val b=(x:Int)=>x+1 b: Int => Int = <function1> scala> def c(x:Int)=x+1 c: (x: Int)Int 虽然这两个定义都有效,但似乎b和c有不同的类型。我想知道他们之间是否有一些区别。为什么Scala对b和c不使用相同的类型?有人对此有想法吗 不重复: 此问题不是链接问题的重复。尽管 它询问使用def和val定义 函数,代
scala> val b=(x:Int)=>x+1
b: Int => Int = <function1>
scala> def c(x:Int)=x+1
c: (x: Int)Int
虽然这两个定义都有效,但似乎b
和c
有不同的类型。我想知道他们之间是否有一些区别。为什么Scala对b
和c
不使用相同的类型?有人对此有想法吗
不重复: 此问题不是链接问题的重复。尽管 它询问使用def和val定义 函数,代码示例表明询问者很困惑 关于Scala中方法和函数之间的差异。这个 示例根本不使用def定义函数亚伦 诺夫斯特鲁普7小时前
使用
def
创建一个方法(对于REPL,它将在某个全局不可见对象中创建一个方法),val
将创建一个匿名函数,并将其分配给指定的符号
当调用它们时,它们几乎是相同的东西;当您传递它们时,会有差异,但是Scala通过透明地执行ETA扩展来隐藏它。例如,如果您定义以下内容:
def isEven(i: Int): Boolean = i % 2 == 0
然后打电话
list.filter(isEven)
Scala正在以一种类似于使用val
的方式为您转换它;将其视为伪代码,因为我不太了解scala的内部结构,但在高层,会发生以下情况:
list.filter((i: Int) => isEven(i))
其中一个问题将为每次调用生成新的函数实例。此问题不是链接问题的重复。尽管它询问了使用
def
和val
定义函数之间的区别,但代码示例清楚地表明询问者对此感到困惑。该示例根本不使用def
来定义函数。
list.filter((i: Int) => isEven(i))