Почему метод drop () в Scala допускает отрицательное значение и не выдает ошибку? - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь испачкать руки с помощью Scala, где я играю с scala.collection.immutable.StringOps на терминале. В методе String drop() я попытался выполнить этот код

"stackoverflow".drop(-12)

и результат, который я получил, был

stackoverflow

-12 был опечаткой, но этот результат неожиданный, так как он должен усечь 12 символов из последнего или быть ошибкой или исключением. Потому что, когда мы передаем целое число в drop (), оно удаляет первые символы из строки, эквивалентные количеству аргументов. Почему это поведение сохраняется с этим методом в Scala? Может ли это стать полезным в некоторых сценариях? В чем причина такого поведения?

Scala имеет множество других поведений, которые не поддерживаются другими языками, например

true > false равно true, а true < false равно false.

1 Ответ

0 голосов
/ 11 сентября 2018

Документация гласит: «Если n отрицательно, не удаляйте никакие элементы». Я предполагаю, что причина в том, что в некоторых случаях это позволяет вам пропустить математику. Например, допустим, вы хотите удалить с начала две строки, чтобы они имели одинаковую длину. Вы могли бы сделать:

def makeSameLength(s1: String, s2: String): (String, String) = {
  (s1.drop(s1.size-s2.size), s2.drop(s2.size-s1.size))
}

Случаи, подобные этому, когда вам приходится отбрасывать какое-то переменное число элементов из последовательности, часто встречаются, и обычно, если математика работает с отрицательным числом, это означает, что вы просто не хотите ничего отбрасывать. Таким образом, это избавляет вас от необходимости добавлять какую-то условную логику или включать max(x, 0) или аналогичный.

Я согласен, что это немного удивительно, но я понимаю, почему это может быть полезно.

...