为什么"如果表达不是陈述"很酷?

时间:2016-02-14 23:06:42

标签: scala if-statement functional-programming semantics tradeoff

我听过很少有关于现代编程语言的讨论,比如scala(以及其他几种我现在都记不起来的语言),当说话者说话时常常会感到兴奋:"如果是表达式在我们的编程语言中,它返回值,WOW"。所以问题是,为什么if作为表达式而不是C中的语句更好?

2 个答案:

答案 0 :(得分:3)

它与处理而不是处理(重新)分配有关。值很简单,(重新)分配很难; 考虑一下java,其中 if 是一个语句, blocks {} 也是一种语句, 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中我需要保留整个方法,并且实际上在我脑海中执行它以便能够推断出哪些顶级变量得到更新以及何时更新。 BTW java有?: operator但是与scala的表达相比它非常有限(主要是因为你不能在其中使用brakets)。

答案 1 :(得分:1)

有些人可能会感到惊讶,但有些语言完全没有“陈述”。一个例子是Haskell。在这种情况下,除了if表达式别无选择。

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

cond ? "yes" : "no"

顺便提一句,命令式语言短路这样的表达式,它是对第二和第三个表达式的延迟评估的俚语(就像Haskell一样)。