【问题标题】:Scala: How to cast this if-then-else ladder as pattern matchingScala:如何将这个 if-then-else 阶梯转换为模式匹配
【发布时间】:2016-09-08 02:00:03
【问题描述】:

我有以下使用 if-then-else 阶梯的代码:

val test: Array[Array[Int]] = ...
val dim = 3 
if (dim < test.length - 1) {
    1   
} else {
    0
}

我尝试将其转换为模式匹配:

val dim = 3 
val maxDim = test.length - 1
dim match {
   case _ < maxDim => {
       1        
   }
   case _ => {
       0        
   }
}

但这会产生多个错误......我如何才能将其作为模式匹配?

更新:另一种尝试是

dim match {
    case maxDim => 0
    case _ => 1
}

但也不行

【问题讨论】:

  • 在“模式匹配”这句话中有一个提示。它不仅仅是为 if/else 提供替代关键字,这就是您似乎试图使用它的方式。 @Mastran 提供了答案,但实际上,任何关于 Scala 的介绍性文字都会涵盖这一点。因此,在每种情况下,提供要匹配的模式(可以是您的示例中的数字文字),提供保护以进一步测试该匹配,然后指定模式匹配和保护条件为真时应该发生的情况。

标签: scala functional-programming pattern-matching


【解决方案1】:

test.lift(dim).fold(0){ _ =&gt; 1}

这不是模式匹配,但重点是在这种情况下您不需要模式匹配。

解释:您的if-then 基本上是在测试索引是否对数组有效,如果是则返回 1,如果不是则返回 0(我假设缺少对负值的测试是疏忽,而不是有意的功能)。

scala 中的集合是从Int 到元素类型的PartialFunctions,它们在对集合有效的索引域上定义,并返回该索引处元素的值。

PartialFunction.lift 是一种实用程序,可让您测试是否定义了部分函数,​​并在一次完成时应用它。如果在参数值处定义,它将返回结果的Option,否则,您将得到None

因此,如果dim 无效,则上面的test.lift(dim) 返回None,否则返回Some 数组。然后我们.fold选项:.fold返回第一个参数是选项为空,如果不是则执行函数。

综上所述:我们得到一个Option 指示索引是否有效,然后.fold 如果它为空则返回0,否则返回1。

【讨论】:

    【解决方案2】:

    如果您需要测试布尔表达式,则需要在匹配案例中使用 if 子句。试试这个:

    dim match {
      case i if i < maxDim => 1
      case _ => 0
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2021-06-15
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      相关资源
      最近更新 更多