首页 > 解决方案 > 为什么 Scala 中的 drop() 方法允许负值并且不抛出错误?

问题描述

我正试图用 Scala 弄脏我scala.collection.immutable.StringOps在终端上玩的地方。在 String 方法drop()中,我尝试执行此代码

"stackoverflow".drop(-12)

我收到的输出是

stackoverflow

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

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

true > falsetruetrue < falsefalse

标签: stringscalascala-collections

解决方案


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

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

像这种你必须从一个序列中删除一些可变数量的元素的情况经常出现,通常如果数学结果为负数,这意味着你根本不想删除任何东西。因此,这使您不必添加一些条件逻辑,或者包含一个max(x, 0)或类似的。

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


推荐阅读