我有以下代码,它使用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
}
但不起作用
答案 0 :(得分:4)
test.lift(dim).fold(0){ _ => 1}
这不是模式匹配,但重点是在这种情况下你不需要模式匹配。
解释:你的if-then
thingy基本上测试索引是否对数组有效,如果是,则返回1,如果不是则返回0(我假设,缺乏对负值的测试是疏忽,而不是故意的特征)。
scala中的集合是PartialFunctions
从Int
到元素类型,它们在对集合有效的索引域上定义,并返回该索引处元素的值。
PartialFunction.lift
是一个实用程序,它允许您测试是否定义了部分函数,如果它是一次性的话,则应用它。如果它在参数值中定义,它将返回结果的Option
,否则,您将获得None
。
因此,test.lift(dim)
如果None
无效则返回dim
,否则返回Some
数组。然后我们.fold
选项:.fold
返回第一个参数是选项为空,如果不是则执行该函数。
全部放在一起:我们得到Option
表示索引是否有效,然后.fold
如果它为空则返回0,否则返回1。
答案 1 :(得分:2)
如果需要测试布尔表达式,则在匹配大小写中需要if子句。试试这个:
dim match {
case i if i < maxDim => 1
case _ => 0
}