我试图理解Scala中的理解,我有很多我理解的例子......
我很难搞清楚的一件事是for()vs for {}.我已经尝试了两种方式,似乎我可以在一种情况下做一件事,但在另一种情况下它会中断.
例如,这不起作用:
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
Run Code Online (Sandbox Code Playgroud)
但是,如果将其更改为{},则会进行编译:
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
Run Code Online (Sandbox Code Playgroud)
这些例子来自我正在参加的Coursera课程.教授没有在视频中提及"为什么",我想知道是否有其他人知道.
谢谢!
根据规范中的语法,似乎parens和braces可以互换:
但由于发电机是由半成品分开的,因此遵循以下规则:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
564 次 |
| 最近记录: |