为什么 "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 版本显然更易于理解))) someObject
是 value 所以它被分配了一次,我不介意它下面的某个地方被重新分配了。我不必将变量移到 if
和 try
块之外,只是为了让它们对外部可见。如果我有很多嵌套的 if 块,我仍然可以通过查看它来推断每个级别的结果值,而在 java 中我需要保留整个方法,实际上在我的代码中执行它head 能够推断出更新了哪些顶级变量以及何时更新。
顺便说一句 java 有 ?: operator
但与 scala 的 if 表达式相比它非常有限(主要是因为你不能在其中使用括号)。
有些人可能会感到惊讶,但有些语言根本没有 "statements"。一个例子是 Haskell。在这种情况下,别无选择,只能使用 if
表达式。
请注意,任何体面的命令式语言也有 if
表达式。它只是叫法和写法不同,例如:
cond ? "yes" : "no"
顺带一提,命令式语言short circuit这样的表达式,这是俚语第二个和第三个表达式的惰性计算(就像Haskell 无论如何都会这样做)。
我很少听过像 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 版本显然更易于理解))) someObject
是 value 所以它被分配了一次,我不介意它下面的某个地方被重新分配了。我不必将变量移到 if
和 try
块之外,只是为了让它们对外部可见。如果我有很多嵌套的 if 块,我仍然可以通过查看它来推断每个级别的结果值,而在 java 中我需要保留整个方法,实际上在我的代码中执行它head 能够推断出更新了哪些顶级变量以及何时更新。
顺便说一句 java 有 ?: operator
但与 scala 的 if 表达式相比它非常有限(主要是因为你不能在其中使用括号)。
有些人可能会感到惊讶,但有些语言根本没有 "statements"。一个例子是 Haskell。在这种情况下,别无选择,只能使用 if
表达式。
请注意,任何体面的命令式语言也有 if
表达式。它只是叫法和写法不同,例如:
cond ? "yes" : "no"
顺带一提,命令式语言short circuit这样的表达式,这是俚语第二个和第三个表达式的惰性计算(就像Haskell 无论如何都会这样做)。