在Scala REPL中使用`val`和`def`进行函数定义之间的区别?

时间:2015-05-25 16:04:17

标签: 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

用法:

scala> b(1)
res4: Int = 2

scala> c(1)
res5: Int = 2

虽然这两个定义都有效,但bc似乎有不同的类型。我想知道它们之间是否存在一些差异。为什么Scala对bc使用相同的类型?有没有人有这个想法?

不重复:

  

此问题与链接问题不重复。即使   它询问使用def和val来定义a之间的区别   函数,代码示例清楚地表明提问者感到困惑   关于Scala中方法和函数之间的区别。该   示例根本不使用def来定义函数。 - 亚伦   Novstrup 7小时前

1 个答案:

答案 0 :(得分:0)

使用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))