为什么Scala中的drop()方法允许负值且不引发错误?

时间:2018-09-10 21:38:13

标签: string scala scala-collections

我正在尝试与Scala沾手,我正在哪里在终端上玩scala.collection.immutable.StringOps。在String方法drop()中,我尝试执行此代码

"stackoverflow".drop(-12)

我收到的输出是

stackoverflow

-12是一个错字,但是此结果出乎意料,因为它应该从最后截去12个字符,或者是错误或异常。因为当我们将一个整数传递给drop()时,它从字符串中消除了等于参数数量的前几个字符。为什么在Scala中使用此方法保留此行为?在某些情况下这会有用吗?这种行为的原因是什么?

Scala具有其他语言不支持的许多其他不同行为,例如

true > falsetrue,而true < falsefalse

1 个答案:

答案 0 :(得分:4)

文档说“如果n为负,则不要删除任何元素”。我猜测原因是在某些情况下,您可以跳过一些数学运算。例如,假设您要从两个字符串的开头删除,以使它们的长度相等。您可以这样做:

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

在这种情况下,必须从序列中删除一些可变数量的元素,这通常会产生很多结果,通常,如果算术运算结果为负数,则意味着您根本不想删除任何内容。因此,这使您不必添加某些条件逻辑,也不必包含max(x, 0)或类似的内容。

我同意这有点令人惊讶,但是可以理解为什么它可能有用。

相关问题