2014-11-01 96 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