【问题标题】:Why do Clojure vector function results exclude the stop value? [closed]为什么 Clojure 向量函数结果会排除停止值? [关闭]
【发布时间】:2014-02-18 18:43:19
【问题描述】:

请原谅我的新手问题和可能不正确的术语。

Clojure 向量函数产生不包括停止值的值。例如:

=> (subvec [:peanut :butter :and :jelly] 1 3)
[:butter :and]
=> (range 1 5)
(1 2 3 4)

范围的文档明确说明了这一点,但没有给出合理的解释:“...返回一个从开始(包括)到结束(不包括)的惰性 nums 序列......”。

在 Ruby 中,这些操作是包容性的:

(1..5).to_a => [1, 2, 3, 4, 5] [:花生,:黄油,:和,:果冻] [1,3] => [:butter, :and, :jelly]

显然这些是非常不同的语言,但我想知道除了语言设计者的个人偏好之外,是否还有一些潜在的原因?

【问题讨论】:

  • 这里没什么好回答的。 Clojure 使用独占结束索引,Ruby 使用包容性。支持他们两人保持一致。无论哪种方式,排他性与包容性都没什么好争论的。您可能会争辩说,包容性更“直观”,但这取决于您在与谁交谈。
  • 在 Ruby 中,1..5 包含 5,但 1...5 不包含。 Ruby 是双向的。

标签: vector clojure


【解决方案1】:

使最终独占允许您执行诸如将(count collection) 指定为端点而不获取 NPE 之类的事情。这就是这两种方法之间最大的区别。

【讨论】:

  • 这也意味着(range x y) 将是一个长度为(- y x) 的集合。这通常比(+ 1 (- y x)) 更方便,并且java 的String 方法的行为类似。事实上,这是 clojure 行为方式的另一个非常重要的原因:clojure 集合满足 java 集合接口,它使用包含/排除方案。
【解决方案2】:

选择索引可能是为了与 Java 库保持一致。 java.lang.String.substringjava.util.List.subList 都有排他索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 2022-06-16
    • 1970-01-01
    • 2013-09-27
    • 2023-03-11
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多