【问题标题】:Why is the value not being returned as it should be here?为什么没有返回应该在这里的值?
【发布时间】:2016-06-10 17:08:00
【问题描述】:

为什么会这样?

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

returns 不应该让代码短路而不继续前进吗?我觉得对于第二个代码 sn -p 不起作用的原因有一个简单的解释,但我似乎无法找出原因。

【问题讨论】:

  • 应该...但是您的代码中没有return

标签: scala return


【解决方案1】:

首先,您缺少return 声明。在 Scala 中,函数最后一行的值作为返回值返回。

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

在您的第二个代码 sn-p 中,前两个 if 无效,因为没有 return 语句。他们被评估然后什么也没有发生。您的空字符串案例将进入s.head + bar(s.tail) 行并失败,因为 .head 找不到元素。

您可以使用您的第一个代码 sn-p 或将您的第二个代码更改为此..

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

【讨论】:

  • 有道理。谢谢!
  • "在 Scala 中,函数最后一行的值作为返回值返回。"这不是真的。
  • 请注意,您应该按照第一个示例构建代码,在 scala 中不鼓励使用 return。
  • @pedrofurla 正确的说法是什么?不就是最后一行的表达式的值会被返回吗?
  • @pedrofurla 您是否只是想指出最后一行和评估的最后一行之间的区别?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
相关资源
最近更新 更多