我不确定这可能是Scala模式匹配问题。我看到了以下示例,它使用Scala模式匹配。
def sum(ints: List[int]): Int = ints match {
case Nil => 0
}
def sum(ints: List[int]): Int {
ints match {
case Nil => 0
}
}
这两个例子之间的区别是什么?
谢谢:)
答案 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
}
}