Scala中的表达式和语句之间有什么区别

sla*_*vov 9 scala

我是Scala世界的新手,想知道表达式和语句之间有什么区别,为什么if-else用于表达式,而不是语句.如果有办法在if-else中使用语句?

sjr*_*jrd 10

编辑:正如@JörgWMittag在评论中所指出的,这个答案实际上是错误的:Scala规范中确实存在语句:

语句作为块和模板的一部分出现.语句可以是导入,定义或表达式,也可以是空的.

我留下原来的答案,因为我认为它作为OP问题的实际答案仍然很有价值.


Orignal回答

从讽刺的角度来看,Scala中没有这样的声明.有定义(例如defclass)和表达式.所有在其他语言中称为语句的东西都只是一种表达方式.

例如,许多人会调用以下"行",它会打印到控制台,声明:

println("hello")
Run Code Online (Sandbox Code Playgroud)

在Scala中,这是一个表达式.例如,它可以分配给一个值:

val x = println("hello")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,x分配类型的值()(发音为unit)Unit.

除了"理论"之外,通常的做法是调用总是返回()语句的表达式.这意味着上述内容println("hello")也可以视为一种陈述.

现在让我们回过头来if/else.因为一切都是表达式,所以这if/else是一个表达式:

if (cond) 3 else 5
Run Code Online (Sandbox Code Playgroud)

但同样如此

if (cond)
  println("hello")
else
  println("bye")
Run Code Online (Sandbox Code Playgroud)

但是在后一个例子中,if/elsealways总是返回()(因为两者都println返回()),因此你可以将它if/else称为语句.


n8g*_*ray 7

一个表达式是任何可以被评估,以产生一个。当一个语句被求值时,它会导致副作用发生,但不会减少到一个值。

一个有用的经验法则是,如果你可以把它放在赋值的右侧,它就是一个表达式。

val x = (anything legal here must be an expression)
Run Code Online (Sandbox Code Playgroud)

如果你不能把它放在作业的右侧,它可能是一个陈述。例如,这些都不合法,因为右侧的位是语句:

val x = import scala.collection.mutable  // import is a statement
val x = def someFunction() = { ... }  // Function definition is a statement
val x = val y = 42  // Variable assignment is a statement
Run Code Online (Sandbox Code Playgroud)

Scala 与许多功能优先的语言一样,很少有“纯”语句。相反,人们认为(并称为)语句的许多结构都是计算为 的表达式Unit

scala> val x = print("hello world")  // a "print statement" is actually an expression
x: Unit = ()
scala> val x = for (i in Array(1, 2, 3)) println("Hello " + i) // for loops are expressions too!
x: Unit = ()
Run Code Online (Sandbox Code Playgroud)

将“if 语句”视为表达式实际上非常方便:

val meal = if (hungry) Some(food) else None
Run Code Online (Sandbox Code Playgroud)

tl;dr:语句和表达式之间的技术区别在于,表达式的计算结果为值,而语句则不计算。非正式地,许多人使用术语“语句”来指代仅针对副作用进行评估的任何内容,但其中许多“语句”实际上是评估为 的表达式Unit