Scala返回值不是预期的

时间:2014-05-02 03:59:21

标签: javascript scala functional-programming closures

我正在学习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) = {

1 个答案:

答案 0 :(得分:4)

在scala中,如果您在function下方声明,请按reference中的§4.6进行操作:

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

正如评论中所说,它应该低于其他程度:

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