Scala for()vs for {}
我试图理解
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 但是,如果将其更改为{},则会进行编译: 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课程.教授没有提到视频和视频中的“为什么”.我想知道是否有其他人知道. 谢谢! 解决方法
根据规范中的语法,似乎parens和braces可以互换:
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 我已经阅读并理解了过去的这一部分,我从中隐约回想起在括号中启用换行符的要点,也就是说,换行符char被视为nl作为半字符. 因此,您可以将生成器放在单独的行上而不是使用分号. 这是通常的“分号推断”,它允许您不要将分号写为语句终止符.因此,生成器中间的换行符不会被视为半换行符,例如: scala> for (c <- | List(1,2,3) | ) yield c+1 res0: List[Int] = List(2,3,4) scala> for { c <- | List(1,3) | i = c+1 | } yield i res1: List[Int] = List(2,4) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |