lastIndex
в шаблоне является неявным объявлением нового имени, которое связано с любым значением, введенным в совпадение, и скрывает уже определенное lastIndex
, как уже указывалось в двух других постах.Есть две другие возможности вместо использования идентификаторов в верхнем регистре (см. Пост Питера):
Использование обратных галочек, чтобы сообщить компилятору, что это не должно быть объявлением нового идентификатора:
case `lastIndex` => ...
Использование шаблонных охранников:
case x if x == lastIndex => ...
Если вы хотите сделать много удаления на основе индекса для строк, то было бы быстрее использовать Buffer, вызвав toBuffer
для строки, а затем вы можете использоватьremove(i: Int)
метод Буфера.Это медленнее только для одной операции, потому что вам придется преобразовывать Buffer обратно в строку, когда вы закончите, но если вы выполняете много операций произвольного доступа, это намного быстрее.После того, как вы закончите, вы можете позвонить mkString
в Buffer, чтобы вернуть вашу String.Для однократного удаления я бы сделал это так, как предложил Питер, или вот альтернатива:
def takeAllExcept(i: Int, s: String) = s.take(i) + s.drop(i+1)