Scala 具有潜在未定义索引的向量访问

Scala 具有潜在未定义索引的向量访问,scala,Scala,在Scala中,我有一个网格,它由二维向量表示 现在我想定义一个方法,该方法测试给定的行和列是否是网格的一部分,并满足特定条件(在这种情况下,如果数字是>0) 理想情况下,我想做以下工作: g(row)(col) > 0 但是,如果索引超出向量的界限,则会导致异常 我想到的是: def isGt0(g: Grid, row: Int, col: Int) = { if(g.isDefinedAt(row) && g(row).isDefinedAt(col)) g(r

在Scala中,我有一个
网格
,它由二维
向量
表示

现在我想定义一个方法,该方法测试给定的
是否是
网格
的一部分,并满足特定条件(在这种情况下,如果数字是
>0

理想情况下,我想做以下工作:

g(row)(col) > 0
但是,如果索引超出
向量的界限,则会导致异常

我想到的是:

def isGt0(g: Grid, row: Int, col: Int) = {
  if(g.isDefinedAt(row) && g(row).isDefinedAt(col)) g(row)(col) > 0
  else false
}
有更好的方法吗


可以找到完整的示例。

以下内容或多或少与您所拥有的内容相同,但(至少可以说)更加惯用:

def isGt0(g: Grid, row: Int, col: Int) =
  g.lift(row).flatMap(_.lift(col)).fold(false)(_ > 0)
这是因为
Vector[A]
是从
Int
A
的部分函数。我们可以使用
.lift
方法将其作为从
Int
选项[a]
的一个总函数,如果超出范围,则得到
None
。我们使用
flatMap
一元链接两个请求,并使用
fold
检查是否有值,否则返回
false


但是,这两个版本的效率都不是很高,如果您经常这样做并且性能很重要,您可能需要简单的旧边界检查。

您可以先删除if/else、
g.isDefinedAt(row)和&g(row)。isDefinedAt(col)和&g(row)(col)>0
。谢谢您的回答。虽然我不得不承认我有点不太自信,但我希望事情会简单得多。我想我有点被Scala宠坏了。。。