Option[Int] 作为循环中的索引
Option[Int] as index in loop
我是 Scala 的新手,所以我不知道我是否会问一些显而易见的问题。
我目前正在尝试定义一个可以或不可以接收名为 "position" 的参数的函数。此参数是一个 Int(以防用户决定传递它)。否则,它应该被视为 "None"(因为这意味着没有任何内容作为参数传递)。
如果它是 None,则: position = series.length - 1. 我在这里尝试使用 Option,因为我不希望用户在不需要时传递位置。
def example(series: Vector[Double], position: Option[Int]): Vector[Double] = {
position match {
case Some(value) => value
case None => series.length - 1
}
for (i <- position until series.length) {
...
}
}
但是当我尝试在循环中将它作为整数使用时,它给我一个错误(类型不匹配。需要:CanBuildFrom[Nothing, Int, NotInferedCol[Int]]。找到:Int)。
我一直在尝试不同的方法使这个 "position" 成为一个可选值,但我想不通。
提前致谢!
欢迎来到 SO,Raquel。
您的代码中的问题是这个
position match {
case Some(value) => value
case None => series.length - 1
}
是一个不会改变 position
值的表达式,这可能是您所假设的。
您必须绑定表达式产生的值才能在它下面的代码中使用它:
val positionWithDefault =
position match {
case Some(value) => value
case None => series.length - 1
}
for (i <- positionWithDefault until series.length) {
...
}
此外,如评论中所述,match
表达式的行为与您从 getOrElse
中得到的相同
for (i <- position.getOrElse(series.length - 1) until series.length) {
...
}
我是 Scala 的新手,所以我不知道我是否会问一些显而易见的问题。
我目前正在尝试定义一个可以或不可以接收名为 "position" 的参数的函数。此参数是一个 Int(以防用户决定传递它)。否则,它应该被视为 "None"(因为这意味着没有任何内容作为参数传递)。 如果它是 None,则: position = series.length - 1. 我在这里尝试使用 Option,因为我不希望用户在不需要时传递位置。
def example(series: Vector[Double], position: Option[Int]): Vector[Double] = {
position match {
case Some(value) => value
case None => series.length - 1
}
for (i <- position until series.length) {
...
}
}
但是当我尝试在循环中将它作为整数使用时,它给我一个错误(类型不匹配。需要:CanBuildFrom[Nothing, Int, NotInferedCol[Int]]。找到:Int)。
我一直在尝试不同的方法使这个 "position" 成为一个可选值,但我想不通。
提前致谢!
欢迎来到 SO,Raquel。
您的代码中的问题是这个
position match {
case Some(value) => value
case None => series.length - 1
}
是一个不会改变 position
值的表达式,这可能是您所假设的。
您必须绑定表达式产生的值才能在它下面的代码中使用它:
val positionWithDefault =
position match {
case Some(value) => value
case None => series.length - 1
}
for (i <- positionWithDefault until series.length) {
...
}
此外,如评论中所述,match
表达式的行为与您从 getOrElse
for (i <- position.getOrElse(series.length - 1) until series.length) {
...
}