Функция возвращает неправильное значение только тогда, когда размер ввода массива равен 1 - PullRequest
2 голосов
/ 18 мая 2019

У меня есть функция, которую я написал в Scala, которая перебирает массив Option s.Я хочу вернуть первый индекс, для которого опция не None.Мой код работает нормально для всех массивов длиной больше 1. Однако он не работает для массивов размера 1.

Это мой существующий код

def firstSome(): Int = {
    for (i <- 0 until this.arr.length - 1) {
        this.arr(i) match {
            case Some(_) => {
                println("Returns")
                return i
            }
            case None => // do nothing
        }
    }
    println("Oops")
    return -1
}

По некоторым причинами Returns, и Oops распечатаны.Я думал, что функция вернет i после перехода к случаю Some, но каким-то образом она продолжается, несмотря на оператор return.

Я также распечатал this.arr и подтвердил, что элемент внутри массива не None.

Есть идеи, в чем проблема?

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Альтернативой написанию пользовательского цикла может быть использование indexWhere метода, подобного

arr.indexWhere { 
  case Some(_) => true
  case None => false
}

, который также будет работать "из коробки" для массива длины 1.

2 голосов
/ 18 мая 2019

0 until x это диапазон от 0 до x - 1. Таким образом, в вашем for есть ошибка выключения на одну ошибку, она должна быть правильной:

    for (i <- 0 until this.arr.length) {
       ...
    }

Поскольку использование return в Scala очень не рекомендуется , я хотел бы указать вам на метод find, который делает именно то, что вы пытаетесь реализовать здесь.

...