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

Scala中的表达式和语句有什么区别,scala,Scala,我是Scala世界的新手,我想知道表达式和语句之间的区别是什么,以及为什么将if-else用于表达式而不是语句。如果有一种方法可以在if else?编辑中使用语句:正如@Jörg W Mittag在评论中指出的,这个答案实际上是错误的: 语句作为块和模板的一部分出现。语句可以是导入、定义或表达式,也可以是空的 我保留原来的答案,因为我认为它作为OP问题的实用答案仍然很有价值 原始答案 从学究的角度讲,Scala中没有语句。有定义(如def和class)和表达式。在其他语言中被称为语句的一切都只

我是Scala世界的新手,我想知道表达式和语句之间的区别是什么,以及为什么将if-else用于表达式而不是语句。如果有一种方法可以在if else?

编辑中使用语句:正如@Jörg W Mittag在评论中指出的,这个答案实际上是错误的:

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

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


原始答案

从学究的角度讲,Scala中没有语句。有定义(如
def
class
)和表达式。在其他语言中被称为语句的一切都只是一个表达式

val x = (anything legal here must be an expression)
例如,许多人会将打印到控制台的以下“行”称为语句:

println("hello")
在Scala中,这是一个表达式。例如,可以将其指定给一个值:

val x = println("hello")
在这种情况下,
x
被分配类型为
unit
的值
()
(发音为
unit

撇开“理论”不谈,通常的做法是调用总是返回语句的表达式。这意味着上面的
println(“hello”)
也可以被视为一条语句

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

if (cond) 3 else 5
但事实也是如此

if (cond)
  println("hello")
else
  println("bye")

但是,在后一个示例中,
if/else
总是返回
()
(因为这两个
println
s都返回
()
),因此您可以将此
if/else
称为语句。

语句更具命令性,表达式更具功能性。如果这就是你要找的。语句类似于赋值,因此等同于“var”而不是“val”,并且它们不会打印出值,您需要一个println(s“…”)来从中获取值。然而,表达式立即生成值并具有类型

表达式是任何可以通过计算产生值的东西。对语句求值时,它会产生副作用,但不会降低到某个值

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

val x = (anything legal here must be an expression)
如果你不能把它放在作业的右边,它可能是一个语句。例如,这些都不合法,因为右侧的位是语句:

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
Scala和许多函数式第一语言一样,只有很少的“纯”语句。相反,人们认为(并称之为)语句的许多结构是计算为
单位的表达式:

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 = ()
将“if语句”视为表达式实际上非常方便:

val meal = if (hungry) Some(food) else None
tl;dr:语句和表达式之间的技术区别在于,表达式的计算结果是值,而语句的计算结果不是值。非正式地说,许多人使用“陈述”一词来指代任何只针对副作用进行评估的东西,但其中许多“陈述”实际上是评估为
单位的表达式

Scala中的所有内容都是一个表达式

理论:
  • 指令/语句在命令式语言(如Java)中执行,而在函数式语言(声明式编程)中(如Scala)则对表达式进行计算
  • 指令意味着为我做某事,而表达意味着给我某事的价值
实用: 如果有其他表达式: 为了证明这一点,我们可以直接在println中使用这个表达式

println(if(aCondition) 4 else 2)

注意:此处If-else表达式给出值,而不是根据条件设置/执行某项操作。

“以及If-else中是否有使用语句的方法”。“为什么?”鲍里斯只是好奇而已。如果不可能的话,okI在两个小时前写了一个同样的答案,然后打开SLS用链接修改它,让我惊讶的是在规范中找到了语句和语句序列的定义:-/想提供链接或节号吗?nvm,我找到了他们:那就是。。。惊人的^^