【问题标题】:The differences between using `val` and `def` for function definition in Scala REPL?在 Scala REPL 中使用 `val` 和 `def` 进行函数定义的区别?
【发布时间】:2015-08-07 03:44:27
【问题描述】:

我在 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 定义一个 函数,代码示例清楚地表明询问者很困惑 关于Scala中方法和函数之间的区别。这 示例根本不使用 def 来定义函数。 – 亚伦 Novstrup 7 小时前

【问题讨论】:

  • 其中一个会为每次调用生成新的函数实例。
  • 这个问题不是链接问题的副本。尽管它询问了使用defval 定义函数之间的区别,但代码示例清楚地表明提问者对the difference between methods and functions in Scala 感到困惑。该示例根本没有使用def 来定义函数。

标签: scala functional-programming


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2013-09-24
    • 2013-11-05
    • 2011-05-25
    • 2021-02-16
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多