为什么价值没有归还,因为它应该在这里?

时间:2016-06-10 17:08:01

标签: scala return

为什么这样做?

index = 0
for item in myList:
    myList[index] = item.strip()
    index += 1

for item in myList:
    print "'"+item+"'"

虽然这个没有。

object Foo extends App {
  def bar(s: String): String = {
    if (s.size == 0) "empty string"
    else if (s.size == 1) s + s
    else s.head + bar(s.tail)
  }

  println(bar(""))
  println(bar("s"))
  println(bar("soom"))
}

[info] Running example.Foo
empty string
ss
soomm

object Foo extends App { def bar(s: String): String = { if (s.size == 0) "empty string" if (s.size == 1) s + s s.head + bar(s.tail) } println(bar("")) println(bar("s")) println(bar("soom")) } java.util.NoSuchElementException: next on empty iterator 不应该使代码短路而不能继续前进吗?我觉得有一个简单的解释,为什么第二个代码片段不起作用,但我似乎无法找出原因。

1 个答案:

答案 0 :(得分:2)

首先,您错过了return声明。在Scala中,函数最后一行的值将作为返回值返回。

现在你的第一个代码段是有效的,因为if else语句被视为一个表达式,因此你有一个表达式作为要返回的最后一行。

在你的第二个代码片段中,前两个ifs没有效果,因为没有return语句。他们被评估然后没有任何反应。您的空字符串大小写将转到s.head + bar(s.tail)行并且失败,因为.head无法找到元素。

您可以使用第一个代码段或将第二个代码段更改为此内容。

object Foo extends App {
  def bar(s: String): String = {
    if (s.size == 0) return "empty string"
    if (s.size == 1) return s + s
    s.head + bar(s.tail)
  }

  println(bar(""))
  println(bar("s"))
  println(bar("soom"))
}