我在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
虽然这两个定义都有效,但b
和c
似乎有不同的类型。我想知道它们之间是否存在一些差异。为什么Scala对b
和c
使用相同的类型?有没有人有这个想法?
不重复:
此问题与链接问题不重复。即使 它询问使用def和val来定义a之间的区别 函数,代码示例清楚地表明提问者感到困惑 关于Scala中方法和函数之间的区别。该 示例根本不使用def来定义函数。 - 亚伦 Novstrup 7小时前
答案 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))