2012-03-23 29 views
1

我遵循C系列(PHP是一個想法!)要求,跨越多行的語句必須包含在curlies中。不理解如何在不存在{}卷積塊的情況下解析多行語句

Scala避免在O'Reilly編程Scala中的代碼中解析錯誤。

def apply(specification: String): Option[Widget] = specification match { 
    case ButtonExtractorRE(label) => new Some(new Button(label)) 
    case TextFieldExtractorRE(text) => new Some(new TextField(text)) 
    case _ => None 
    } 

,而我相信它應該像(函數體被封閉):

def apply(specification: String): Option[Widget] = { 
    specification match { 
      case ButtonExtractorRE(label) => new Some(new Button(label)) 
      case TextFieldExtractorRE(text) => new Some(new TextField(text)) 
      case _ => None 
      } 
    } 

而斯卡拉可以分析它,可以做程序員「得到它」?我不。我是否錯過了一些直觀的想法?

應該我寧願避免這種做法,如果它導致實際問題(如可讀性差?

+0

我不確定我是否理解這個問題。看起來你問爲什麼這個代碼示例可以在沒有大括號的情況下解析,即使示例* does *有大括號。 – 2012-03-23 18:14:48

+0

更新了我的問題。不知道我犯了一個愚蠢的錯誤(以及它是什麼) – aitchnyu 2012-03-23 18:25:22

回答

3

在斯卡拉更多的東西(包括if,matchforyield)以其他語言返回結果。而更多的數據結構是不可變的,這通常會導致轉化鏈map,filter,flatMap, collect等 - 這也只給出一個結果。最後但並非最不重要的Scala對元組提供了很好的支持,這意味着您經常會返回一個元組作爲單個結果,其他語言必須整理單個值。

所以一般來說Scala並不像其他語言那樣處理存儲中間值的變量。這意味着一個函數通常只是一個方程f(a)= b,其中b可能相當複雜,但仍然是一個鏈返回單個結果。因此,採用這種語法很自然,這使得您立即明白,您並不是在處理中間結果,而是您遵循了更實用的風格。

應該提到的是,函數式語言(除了具有完全不同語法的「lispy」系列)具有相似的約定。所以,如果你看看Haskell,F#或Erlang,你通常不會看到任何方法的「塊」。有像let,case和(對於Haskell)do這樣的結構可能看起來有點像塊,但也是表達式。

+0

是的,閱讀它作爲函數f(a)= b更有意義。你對這種風格做了完美的公正。 – aitchnyu 2012-03-24 05:19:24

3

當你說一個函數=(沒有大括號),它編譯和工作得很好,因爲它是一個單一的表達。'match'表達式總是計算爲一個單一的值,'match'是你函數中唯一的東西,所以實際上它只是一個表達式,即使它跨越了幾行,如果你的apply函數需要多個表達式和聲明,然後是的,你確實需要花括號。

1

你有一個函數只包含一個表達式。許多語言仍然需要用大括號括起來。

如果你只習慣於這種語言,這可能會令人困惑。但是在使用Scala之後,使用單個表達式來定義一個函數定義,當body開始看起來像一個函數值'variable'時。

從那一刻起,你將不再錯過大括號。因此:在幾乎所有情況下,我都會跳過所有我不需要的大括號。我很長一段時間沒有問題。

1

我遵循C族要求,跨越多行的語句必須包含在curlies中。

錯誤。

#include <iostream> 
using namespace std; 

int main() { 
    bool b = true; 
    char c = 'a'; 
    if (b) switch (c) { 
    case 'a': cout << "It's a" << endl; break; 
    default : cout << "Not a" << endl; break; 
    } 
} 

這裏if語句的真正分支跨越多行,但沒有括在大括號中。事實上,你有沒有使用if/else?

if (foo) { 
    // do foo stuff 
else if (bar) { 
    // do bar stuff 
} else { 
    // do non-foo/bar stuff 
} 

在句法上,else if沒有特別處理。 else只是一個常用的關鍵詞。這是語法相當於

if (foo) { 
    // do foo stuff 
else { 
    if (bar) { 
    // do bar stuff 
    } else { 
    // do non-foo/bar stuff 
    } 
} 

注意括號不需要包圍內如果。這是因爲if/else語句是一個獨立的單個表達式。規則並不是將任何括號用於跨越多行的任何語句。相反,我認爲可以公平地說,任何以分號分隔的語句都必須用大括號分組。免責聲明:我不是C專家。如果您需要確定,請檢查文檔。

我也不是斯卡拉專家,但通常我認爲斯卡拉的思維方式是儘可能地去除花括號,當然要有良好的判斷力和品味。

相關問題