为什么 Scala 中的 drop() 方法允许负值并且不抛出错误?
Why does drop() method in Scala allow negative value and does not throw error?
我正在尝试用 Scala 弄脏我在终端上玩 scala.collection.immutable.StringOps
的地方。在字符串方法 drop()
中,我尝试执行此代码
"Whosebug".drop(-12)
我收到的输出是
Whosebug
-12
是一个拼写错误,但这个结果是意外的,因为它应该从最后截断 12 个字符或者是错误或异常。因为当我们将一个整数传递给 drop() 时,它会从字符串中删除相当于参数数量的第一个字符。为什么这种行为在 Scala 中与这种方法保持一致?这在某些情况下是否有用?这种行为的原因是什么?
Scala 有许多其他语言不支持的不同行为,例如
true > false
是 true
,true < false
是 false
。
文档说 "If n is negative, don't drop any elements"。我猜原因是在某些情况下它可以让你跳过一些数学运算。例如,假设您想从两个字符串的开头删除,使它们的长度相等。你可以这样做:
def makeSameLength(s1: String, s2: String): (String, String) = {
(s1.drop(s1.size-s2.size), s2.drop(s2.size-s1.size))
}
像这样的情况,你必须从一个序列中删除一些可变数量的元素,通常如果数学计算结果为负数,这意味着你不想删除任何东西全部。因此,这使您不必添加一些条件逻辑,或包含 max(x, 0)
或类似的。
我同意这有点令人惊讶,但我明白为什么它可能有用。
我正在尝试用 Scala 弄脏我在终端上玩 scala.collection.immutable.StringOps
的地方。在字符串方法 drop()
中,我尝试执行此代码
"Whosebug".drop(-12)
我收到的输出是
Whosebug
-12
是一个拼写错误,但这个结果是意外的,因为它应该从最后截断 12 个字符或者是错误或异常。因为当我们将一个整数传递给 drop() 时,它会从字符串中删除相当于参数数量的第一个字符。为什么这种行为在 Scala 中与这种方法保持一致?这在某些情况下是否有用?这种行为的原因是什么?
Scala 有许多其他语言不支持的不同行为,例如
true > false
是 true
,true < false
是 false
。
文档说 "If n is negative, don't drop any elements"。我猜原因是在某些情况下它可以让你跳过一些数学运算。例如,假设您想从两个字符串的开头删除,使它们的长度相等。你可以这样做:
def makeSameLength(s1: String, s2: String): (String, String) = {
(s1.drop(s1.size-s2.size), s2.drop(s2.size-s1.size))
}
像这样的情况,你必须从一个序列中删除一些可变数量的元素,通常如果数学计算结果为负数,这意味着你不想删除任何东西全部。因此,这使您不必添加一些条件逻辑,或包含 max(x, 0)
或类似的。
我同意这有点令人惊讶,但我明白为什么它可能有用。