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 语句中是否不能有多个表达式?有人可以帮助我第一个代码有什么问题吗
大多数语言定义如下:
(这些不是教科书定义,但我们在这里不要太详细)。
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)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |