string - 为什么 Scala 中的 drop() 方法允许负值并且不抛出错误?
问题描述
我正试图用 Scala 弄脏我scala.collection.immutable.StringOps
在终端上玩的地方。在 String 方法drop()
中,我尝试执行此代码
"stackoverflow".drop(-12)
我收到的输出是
stackoverflow
这-12
是一个错字,但这个结果是出乎意料的,因为它应该从最后一个截断 12 个字符,或者是一个错误或异常。因为当我们将整数传递给 drop() 时,它会从字符串中删除与参数数量相等的第一个字符。为什么这种行为在 Scala 中与这种方法保持一致?这在某些情况下会变得有用吗?这种行为的原因是什么?
Scala 还有许多其他语言不支持的不同行为,例如
true > false
是true
和true < false
是false
。
解决方案
文档说“如果 n 为负数,请不要删除任何元素”。我猜原因是在某些情况下它可以让你跳过做一些数学运算。例如,假设您想从两个字符串的开头删除,以使它们的长度相等。你可以这样做:
def makeSameLength(s1: String, s2: String): (String, String) = {
(s1.drop(s1.size-s2.size), s2.drop(s2.size-s1.size))
}
像这种你必须从一个序列中删除一些可变数量的元素的情况经常出现,通常如果数学结果为负数,这意味着你根本不想删除任何东西。因此,这使您不必添加一些条件逻辑,或者包含一个max(x, 0)
或类似的。
我同意这有点令人惊讶,但可以理解为什么它可能有用。
推荐阅读
- android - deleteDirectory: java.lang.NoSuchMethodError: 没有虚拟方法 toPath
- go - 如何使用 mongo-driver 连接到其他包
- mysql - Laravel - DatabaseTransactions - 超过锁定等待超时
- python - 如何解决 Telethon 相关脚本中的“数据库已锁定”
- django - 使用 docker compose,如何使用相同的地址在内部和外部访问服务?
- javascript - 如何在功能组件 React Native 中删除 Header
- kubernetes - Kubectl 描述 Ingress 的返回 404
- javafx - 将 TableView 绑定到 ObservableList
- localhost - 无法从同一台机器中形成的集合中停止 Zookeeper 节点
- hibernate - 如何在 Hibernate Search 中按日期作为 LocalDateTime 进行搜索?