2014-11-01 109 views
5

我想了解在Scala中解析,和我有很多的例子,我有點明白...斯卡拉(),相較於{}

有一件事我有一個困難時期搞清楚是()vs爲{}。我已經嘗試了兩種方式,看起來我可以在一箇中做一件事,但它在另一件事中突破。

例如,這不工作:

def encode(number: String): Set[List[String]] = 
    if (number.isEmpty) Set(List()) 
    else { 
    for (
     split <- 1 to number.length 
     word <- wordsForNum(number take split) 
     rest <- encode(number drop split) 
    ) yield word :: rest 
    }.toSet 

但是,如果將其更改爲{},它編譯:

def encode(number: String): Set[List[String]] = 
    if (number.isEmpty) Set(List()) 
    else { 
    for { 
     split <- 1 to number.length 
     word <- wordsForNum(number take split) 
     rest <- encode(number drop split) 
    } yield word :: rest 
    }.toSet         

這些例子都是從Coursera類我服用。教授沒有提到視頻中的「爲什麼」&我想知道是否有人知道。

謝謝!

+0

感謝真正徹底的答案 - 我沒有多VS單行例子連接需要{}我正在努力。 – anonygrits 2014-11-02 11:34:21

回答

7

從規範的語法,它可能看起來括號和括號是可以互換的:

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#for-comprehensions-and-for-loops

但由於發電機被分離半成品,以下規則踢:

http://www.scala-lang.org/files/archive/spec/2.11/01-lexical-syntax.html#newline-characters

我已閱讀並理解在過去的那一段,從中我依稀記得,換行符括號啓用的要點,這是說,換行符被視爲nl,其作爲semi

所以你可以把發生器放在單獨的行而不是使用分號。

這是通常的「分號推理」,它可以讓你不用分號作爲語句終止符。因此,在發電機的中間換行不視爲半,例如:

scala> for (c <- 
    | List(1,2,3) 
    |) yield c+1 
res0: List[Int] = List(2, 3, 4) 

scala> for { c <- 
    | List(1,2,3) 
    | i = c+1 
    | } yield i 
res1: List[Int] = List(2, 3, 4) 
4

在Scala()中通常用於當你只有一個語句時。像這樣的東西會工作:

def encode(number: String): Set[Int] = 
    if (number.isEmpty) Set() 
    else { 
    for (
     split <- 1 to number.length // Only one statement in the comprehension 
    ) split 
    }.toSet 

再加一個,它將無法編譯。同樣是真實的地圖例如

OK

List(1,2,3).map(number => 
    number.toString 
) 

不正常(必須使用大括號)

List(1,2,3).map(number => 
    println("Hello world") 
    number.toString 
) 

這是爲什麼。我不知道:)

+0

我以前並沒有意識到多行需要{}。很好的接收。 – javadba 2014-11-01 08:16:20

+1

@javadba有些人(odersky)總是圍繞多行表達式放置括號,而其他人(paulp)更喜歡圍繞一個恰好是多行的expr。 'def f =(if(c)x else y)' – 2014-11-01 21:20:40

+0

@ som-snytt thx指針。父母/大括號令我感到困惑。 – javadba 2014-11-01 23:45:44