里面的陈述?:表达

时间:2014-02-01 14:05:31

标签: java scala

我正在学习scala并尝试理解以下句子:

  

在Java中,您不能将语句放在?:表达式

有人可以向我解释一下这个问题,也许是在一个例子中,也许是在Scala的背景下?

3 个答案:

答案 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等)。语句是执行的,表达式是导致值的东西。它变得令人困惑,因为你可以将可执行文件放在表达式中。