Scala模式匹配双花括号

时间:2016-08-27 11:34:02

标签: scala pattern-matching brackets

我不确定这可能是Scala模式匹配问题。我看到了以下示例,它使用Scala模式匹配。

def sum(ints: List[int]): Int = ints match {
  case Nil => 0
}

def sum(ints: List[int]): Int {
  ints match {
    case Nil => 0
  }
}

这两个例子之间的区别是什么?

谢谢:)

2 个答案:

答案 0 :(得分:1)

在Scala中,如果您将模式匹配作为函数内的第一个表达式,则可以通过两种方式编写语法,但它们是等效的。

注意:这里我们直接从模式匹配开始:

def toInt(optStr: Option[String]): Option[Int] = optStr match {
 case Some(str) = Some(str.toInt)
 case None =>  None
}

另一种说法是你在多线括号中做同样的事情

 def toInt(optStr: Option[String]): Option[Int] = {
  //same pattern matching inside multiline brackets
  optStr match {
    case Some(str) = Some(str.toInt)
    case None => None
  }

}

答案 1 :(得分:1)

大括号是Scala用来将一组表达式粘合在一起的方式,其结果是块中最后一个表达式的结果。

例如:

{
    val x = 3
    x*2
}

是一个结果为6的表达式。

在花括号内写一个单独的表达式是多余的,只会出于美学目的而有意义。

回到你的模式匹配:

ints match {
  case Nil => 0
}

表达式是否与其他表达式相同,因此您可以在花括号中编写它。

{
    ints match {
      case Nil => 0
    }
}

Scala允许您将方法体定义为一组表达式:

def methodName(params...) { exp0; exp1; .., resExp } // Return type will be Unit.

请注意,Scala的类型推断会将methodName返回类型确定为Unit

或者=右侧有一个表达式,也可以是一组用大括号粘贴的表达式。

def methodName(params...): Type = expression
def methodName(params...) = expression //Return type will be the expression's type.

所以你可以用这3种形式写出来:

// `=` with a single expression at is right side.
def sum(ints: List[Int]): Int = ints match {
  case Nil => 0
}

// `=` with a glued sequence of expressions at is right side.
def sum(ints: List[Int]): Int = {
    ints match {
      case Nil => 0
    }
}

// A glued sequence of expressions at is right side, but its return type will be Unit!
def sum(ints: List[Int]) {
    ints match {
      case Nil => 0
    }
}