【问题标题】:Scala return value not what is expectedScala返回值不是预期的
【发布时间】:2014-06-18 16:29:43
【问题描述】:

我正在学习 Scala 作为个人兴趣,我对以下返回值感到困惑,我希望最终会打印出 52:

def lexicalTest(a: Int) = {
  (b: Int) => {
    (c: Int) => {
        a + b + c
    }
  }
}

val step01 = lexicalTest(10)

val step02 = step01(10)


def plusThirty(a: Int, b: Int) {
  a + b
}

println(plusThirty(22, step02(10)))

如果step02(10)肯定返回30,而且是Int类型,那为什么我的返回等于()

FWIW:我是从让这种东西在 JavaScript 中工作的角度出发的。

更新:感谢 cookie 怪物,def plusThirty(a: Int, b: Int) { 应该是 def plusThirty(a: Int, b: Int) = {

【问题讨论】:

  • 我对 Scala 一无所知,但我注意到您的plusThirty 函数的第一行中没有=。我在在线 Scala 评估器中尝试了它,并修复了它。 def plusThirty(a: Int, b: Int) = {
  • 啊!非常感谢。总是在背后捅自己一刀 =) 它有效
  • 原因是没有= 的函数被定义为返回Unit 的函数,因此不会返回表达式的结果
  • 关于您的代码的注释(曾经通过引入缺少的= 进行修复):您使用的每个花括号都是不必要的!

标签: javascript scala functional-programming closures


【解决方案1】:

在 Scala 中,根据reference 的§4.6,如果您在function 下方声明:

def f(n:Somthing) = {}

然后从块返回的返回类型中获取f 的返回类型,除非手动指定(感谢类型推断)。

根据 §4.6.3,以下是 procedure

def f(n:Somthing) {}

f 的返回类型是 Unit,即使它显示为 Int。事实上,如果您手动使用 return 而不是隐式 return,在 repl 中它会给出:

scala> def plusThirty(a: Int, b: Int) {
     |  return a + b
     | }
<console>:8: warning: enclosing method plusThirty has result type Unit: return value discarded
        return a + b
        ^
plusThirty: (a: Int, b: Int)Unit

scala> plusThirty(22, step02(10))

所以正如 cmets 中所说,它应该在下面,否则它会是一个过程:

def plusThirty(a: Int, b: Int)  = {
  a + b
}

【讨论】:

  • 这就是为什么在未来的 Scala 版本中将删除过程定义语法的原因。
  • Martin Odersky 本人现在认为明确注释返回类型Unit 的“equal-free”简写是一个错误,并建议不要这样做。我同意,我的组织现在需要在我们的代码中使用手写格式。
猜你喜欢
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 2013-03-22
  • 2012-02-04
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多