scala 中的返回语句

1 functional-programming scala return

我试图了解 scala 中的 return 。这里我写了一个简单的函数来添加两个int。

def sum(x: Int, y: Int ): Int = {
 val sum = x+ y
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误

cmd2.sc:3: type mismatch;
 found   : Unit
 required: Int
Run Code Online (Sandbox Code Playgroud)

如果我编写如下相同的程序

def sum(x: Int, y: Int ): Int = {
 val sum =x
 sum +y
}
Run Code Online (Sandbox Code Playgroud)

没事。

scala return 语句中是否不能有多个表达式?有人可以帮助我第一个代码有什么问题吗

Mat*_*zok 6

大多数语言定义如下:

  • 声明 - 我们可以直观地认为它是一个可以独立存在的程序
  • 表达式 - 它是一段具有值的程序(可用于将其与其他值组合、传递等)

(这些不是教科书定义,但我们在这里不要太详细)。

Scala 试图尽可能地消除这种区别,因此,egprintln("foo")是类型的表达式Unit,而在 Java 中,它是一个语句并且没有值。但有些地方无法避免这种区别。

val/var定义不是表达式而是语句。所以你不能做这样的事情:

val a = val b = 2 // illegal start of simple expression
Run Code Online (Sandbox Code Playgroud)

但是,您可以将其作为代码块的一部分,告诉语言其作用域的开始和结束位置(使用方括号或 Scala 3 无括号语法):

val a = {
  val b = 2
}
Run Code Online (Sandbox Code Playgroud)

代码块的类型和值取自该块计算的最后一个值。(这意味着块的一部分可能并不都是表达式,但整个块可以用作值/表达式)。通常这是它的最后一个表达。但如果它是一个类似val定义的语句,则推断为Unit

val a: Unit = {
  val b: Int = 2
}
Run Code Online (Sandbox Code Playgroud)

请注意,这与说赋值会丢弃该值不同:

var b: Int = 0
val a = (b = 10)
Run Code Online (Sandbox Code Playgroud)

因为给 赋值var是一个表达式...尽管它的类型也是Unit。差异很微妙,但您可以在以下示例中看到它:

import scala.util.chaining._

(val a = 2).tap(println) // <- this would not compile
var b = 0
(b = 2).tap(println) // <- this would print: ()
Run Code Online (Sandbox Code Playgroud)

()注意和之间的区别{}

  • ()用于对表达式中运算符的优先级进行分组/更改,它不会创建新的范围
  • {}允许您使用语句并定义它们的执行顺序,它创建一个新的范围

这很重要,因为:

{ val a = 2 }.tap(println) // prints: ()
Run Code Online (Sandbox Code Playgroud)

会编译并且不理解它所带来的差异。

在您的情况下,您创建了一个块,当您的函数期望时,该块的类型Unit和值被埋入其中。确保最后一行作为表达式计算出正确的值将是一个解决方案:()Int

// {} are not needed if whole body is a single expression
def sum(x: Int, y: Int ): Int = x + y
// but you can use it if you want
def sum(x: Int, y: Int ): Int = {
  x + y
}
// and even use variables as long as
// the expression with the value is last element
def sum(x: Int, y: Int ): Int = {
  val z = x + y
  z
}
// in Scala 3 braces can be replaced with indentation
def sum(x: Int, y: Int ): Int =
  val z = x + y
  z
Run Code Online (Sandbox Code Playgroud)