为什么 "if as expression not statement" 很酷?

Why "if as expression not statement" is cool?

我很少听过像 scala 这样的现代编程语言的演讲(以及其他一些我现在记不起名字的语言),当演讲者像这样说话时,我常常感到兴奋:"if is an expression in our programming language, it returns value, WOW"。所以问题是,为什么 when if 是一个表达式而不是像 C 中的语句更好?

它与处理 而不是处理 (重新)赋值有关。 值是简单的和(重新)赋值很难; 考虑 java,其中 if construct 是一个语句,并且 blocks {} 也是一种语句,并且 try 也是一种说法,两者都不能 return value:

Object someObject = null; // you'll have to scan through all 
// of the scope below to find out where `someObject` got assigned from

try {
  // ... and now imagine this if statements nested with try statements like
  // 20 times, and it's hard to  refactor them into multiple mehtods, 
  // because they are not logically connected

  if (someCondition) {
     someObject = <someValue>; 
  } else {
     someObject = <anotherValue>;
  }
} catch (Exception e) { ....};

与 scala 比较,其中所有这些语句实际上都是表达式并且可以 return 值:

val someObject = try {
   if (someCondition) {
      "someResult" 
   } else {
     { "something else" }
   }
} catch { case Exception e => "someDefaultValue"; }

现在我认为 scala 版本显然更易于理解))) someObjectvalue 所以它被分配了一次,我不介意它下面的某个地方被重新分配了。我不必将变量移到 iftry 块之外,只是为了让它们对外部可见。如果我有很多嵌套的 if 块,我仍然可以通过查看它来推断每个级别的结果值,而在 java 中我需要保留整个方法,实际上在我的代码中执行它head 能够推断出更新了哪些顶级变量以及何时更新。 顺便说一句 java 有 ?: operator 但与 scala 的 if 表达式相比它非常有限(主要是因为你不能在其中使用括号)。

有些人可能会感到惊讶,但有些语言根本没有 "statements"。一个例子是 Haskell。在这种情况下,别无选择,只能使用 if 表达式。

请注意,任何体面的命令式语言也有 if 表达式。它只是叫法和写法不同,例如:

cond ? "yes" : "no"

顺带一提,命令式语言short circuit这样的表达式,这是俚语第二个和第三个表达式的惰性计算(就像Haskell 无论如何都会这样做)。