Опция [Int] в качестве индекса в цикле - PullRequest
1 голос
/ 17 февраля 2020

Я новичок в 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) {
    ...
  }
}

Но когда я пытаюсь использовать его в l oop как целое число, оно выдает мне ошибку (Несоответствие типов. Требуется: CanBuildFrom [Nothing, Int, NotInferedCol [Int]]. Найдено: Int).

Я пробовал разные вещи, чтобы сделать эту «позицию» необязательной, но я не могу понять.

Заранее спасибо!

1 Ответ

2 голосов
/ 17 февраля 2020

Добро пожаловать на SO, Ракель.

Проблема в вашем коде заключается в том, что это

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) {
  ...
}
...