1

我很少听过像 scala 这样的现代编程语言(以及其他一些我现在不记得名字的语言)的演讲,当演讲者谈论时经常会感到兴奋:“如果是我们编程语言中的一个表达式,它返回值,哇”。所以问题是,为什么当if一个表达式而不是一个像 in 这样的语句C更好?

4

2 回答 2

3

它与处理而不是处理(重新)分配有关。价值观很简单,(重新)分配很困难;考虑 java where if construct是一个语句,block {}也是一种语句,try也是一种语句,它们都不能返回值:

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 进行比较,其中所有这些语句实际上都是表达式并且可以返回值:

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

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

于 2016-02-15T10:22:30.423 回答
1

有些人可能会感到惊讶,但有些语言根本没有“语句”。一个例子是 Haskell。if在这种情况下,除了表达之外别无选择。

请注意,任何体面的命令式语言也都有if表达式。它只是以不同的方式调用和编写,例如:

cond ? "yes" : "no"

顺便说一句,命令式语言会短路这样一个表达式,这是对第二个和第三个表达式的惰性求值的俚语(就像 Haskell 一样)。

于 2016-02-15T18:48:07.333 回答