我正在学习scala并尝试理解以下句子:
在Java中,您不能将语句放在?:表达式
中
有人可以向我解释一下这个问题,也许是在一个例子中,也许是在Scala的背景下?
答案 0 :(得分:6)
Java有一个从C继承的三元条件运算符,它看起来像这样:
int x = some_condition ? 1 : 2;
如果x
为真,则 1
将等于some_condition
,否则为2
。 Java要求此运算符的参数是表达式,即导致具体值的事物。例如,方法调用或常量文字是表达式,但循环或条件语句或变量定义不是表达式,因为它们没有有意义的值。这意味着你不能从函数中返回变量定义,但是你可以返回方法调用的结果。
Scala没有三元运算符。但它不需要一个,因为在Scala 中,所有都是表达式。偶数循环 - 它们会产生Unit
类型的特殊值。条件也是表达式,它们返回所有分支的公共超类型的值。因此,您可以使用普通的条件“语句”而不是三元运算符。此Scala代码段与上面的Java代码相同:
val x = if (some_condition) 1 else 2
此外,在Scala中,每个块也是一个表达式(它的值是块中最后一行的值),因此您可以在“三元运算符”中包含语句,例如赋值“:
val x = if (some_condition) {
val y = some_computation()
y*2
} else {
val z = another_computation()
z + 3
}
答案 1 :(得分:3)
更一般地说,你不能在任何表达式中放置任意语句,而不仅仅是条件表达式。
方法的块是语句列表。声明由其他声明和/或表达式组成。但是,作为语句构成块的表达式通常不包含语句。
嗯,有一个例外:表单创建表达式
new C(argument list) { class definition }
这将在编译时创建一个新类,它是C
的子类,并在运行时创建该类的实例。因此,可以编写如下内容:
cond ? (new Object() {
public int get() { System.out.println("Hi"); return 42; }
}).get()
: 0
将语句走私到表达式中。
答案 2 :(得分:1)
你放在?:表达式中的东西是其他表达式。第一个必须求值为布尔值,第二个和第三个求值为相同的类型(int,String等)。语句是执行的,表达式是导致值的东西。它变得令人困惑,因为你可以将可执行文件放在表达式中。