scala for with()vs {}括号vs花括号

时间:2018-03-05 07:17:00

标签: scala for-loop

我见过for循环,括号()和花括号{}的理解看起来非常相似。在我写这段代码之前,我一直认为它们是一样的:

版本1:

def findChar(c: Char, levelVector: Vector[Vector[Char]]): Pos = {
    val positions =
      for {
        row_index <- 0 to levelVector.length - 1
        col_index <- 0 to levelVector(row_index).length - 1
        if (levelVector(row_index)(col_index) == c)
      } yield Pos(row_index, col_index)
    if (positions.length == 1) positions.head
    else throw new Exception(s"expected to find 1 match, but found ${positions.length} matches instead")
  }

第2版:

def findChar(c: Char, levelVector: Vector[Vector[Char]]): Pos = {
    val positions =
      for (
        row_index <- 0 to levelVector.length - 1;
        col_index <- 0 to levelVector(row_index).length - 1;
        if (levelVector(row_index)(col_index) == c)
      ) yield Pos(row_index, col_index)
    if (positions.length == 1) positions.head
    else throw new Exception(s"expected to find 1 match, but found ${positions.length} matches instead")
  }

版本1具有花括号,而版本2具有括号。但是我也注意到版本2没有在箭头行末端没有使用半冒号的情况下编译。为什么是这样?!这两件事情是一样的吗?

2 个答案:

答案 0 :(得分:2)

不,他们不一样。

config表示考虑{}(\ n)

对代码行进行分组

next line也意味着分组但不考虑下一行(\ n),所以即使你的()中间有所有代码\n代码行被视为一行。

答案 1 :(得分:2)

this blog entry

中的

<div class="homelink portfolio-item"> <a href="http://laurahd.com/icons/"> <aside class="callout2"> </aside> </a> <a href="http://laurahd.com/codefu/"> <aside class="callout3"> </aside> </a> </div> 循环定义

  

Expr1 :: ='for'('('Enumerators')'|'{'Enumerators'}')                          {nl} ['yield'] Expr

     

枚举器:: =生成器{semi Generator}

     

Generator :: = Pattern1'&lt; - 'Expr {[semi] Guard | semi Pattern1'='Expr}

     

Guard :: ='if'PostfixExpr

除了换行符之外,它们是相同的。

对于scala scala spec中花括号的情况,您可以找到:

  

以下地方接受多个换行令牌(请注意,在每种情况下,用分号代替换行符都是非法的):

     
      
  • 在条件表达式或while循环的条件与下一个表达式
  • 之间   
  • 在for-comprehension的枚举数和下一个表达式之间,
  •   
  • 在类型定义或声明中的初始类型关键字之后。
  •