1

我聽說過幾個關於現代編程語言如scala(以及其他幾種我現在不記得名字的語言)的談話,並且當發言者說話時經常會感到興奮:「如果是我們的編程語言中的表達式,它會返回值WOW「。所以問題是,爲什麼當if是一個表達式而不是像C這樣的語句更好?爲什麼「如果表達不說明」很酷?

+1

您的意思是? 'foo = x == 1? x:y;' –

+0

因爲它返回一個值,所以你可以用它做一些事情(或者更確切地說:任何事情)? – Bergi

+0

這就是爲什麼它不是很酷:http://stackoverflow.com/q/4038741/1296806 –

回答

3

它與處理有關,而不是處理(重新)分配。值很簡單,(重新)分配很難; 考慮的java其中如果構建是一個語句,也塊{}也排序語句,嘗試是一種說法也和他們都沒有能返回值:

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"; } 

現在我認爲,斯卡拉版本是理解)))顯然更簡單是所以它被分配了一次,我並不覺得它下面的某個地方被重新分配了。我不必將iftry塊之外的變量移動到外部,以便將它們保持可見。如果我有很多嵌套的塊,我仍然可以通過查看它推導出每個級別的結果值,而在java中,我需要保留整個方法,並且實際上在我的頭部執行它以便能夠推導什麼頂級變量被更新以及什麼時候被更新。 順便說一句java有?: operator但與scala的if表達式相比是非常有限的(主要是因爲你不能使用brakets)。

1

有些人可能會感到驚訝,但有些語言根本沒有「聲明」。 Haskell就是一個例子。在這種情況下,除了有if表達式之外別無選擇。

請注意,任何像樣的命令式語言也有if表達式。它只是稱爲和寫入不同,如,例如:

cond ? "yes" : "no" 

順便提及,命令式語言短路這樣的表達,其是用於所述第二的懶惰評估和第三表達(就像Haskell中確實俚語它無論如何)。