如果Scala中的else语句总是需要别的吗?

时间:2014-02-02 08:15:05

标签: scala

我有以下功能可以正常工作:

def power(x: Double, n: Int) : Double = {
  if (n > 0 && n % 2 == 0) power(x, n/2) * power(x, n/2)
  else if (n > 0 && n % 2 == 1) x * power(x, n-1)
  else if (n < 0) 1 / power(x, -n)
  else 1
}

如果我将其更改为:

def power(x: Double, n: Int) : Double = {
  if (n > 0 && n % 2 == 0) power(x, n/2) * power(x, n/2)
  else if (n > 0 && n % 2 == 1) x * power(x, n-1)
  else if (n < 0) 1 / power(x, -n)
  else if (n==0 ) 1
}

即。将最终else语句更改为else if,然后尝试调用该函数时出现以下错误:

> <console>:8: error: not found: value power
                power(2, 1)
                ^

我猜这是因为有一种可能的单位返回类型,因为n的值不能满足任何条件?

3 个答案:

答案 0 :(得分:7)

在Java中,“if-else”是一个声明。在Scala中,它是一个表达式(想想Java的三元组?:),这意味着它总是产生一些价值。正如som-snytt在评论中提到的,如果缺少else块,编译器会提供类型为else ()的{​​{1}},这显然与预期类型{{1}冲突在你的例子中。

in Chris's answer提供了一些有效的Unit错误示例。

答案 1 :(得分:2)

否 - 通常,if表达式不需要else子句。

示例:

if (true) println("a")
// prints "a"

if (false) println("a") else if (true) println("b")
// prints "b"

正如尼基塔·沃尔科夫的回答所说,如果你需要表达式除了Unit之外还有其他类型,那就很有必要。

答案 2 :(得分:0)

你的猜测是正确的。该方法必须返回一个Double,如果非“if ..”情况匹配,则返回Unit。实际上,当你将第二个定义粘贴到repl中时,你应该得到

  

<console>:11: error: type mismatch;   
  found : Unit   
  required: Double