【问题标题】:The use of Seq function in ClojureClojure中Seq函数的使用
【发布时间】:2015-08-15 16:32:58
【问题描述】:

manual of clojure 关于seq 我们读到:;; (seq x) is the recommended idiom for testing if a collection is not empty (every? seq ["1" [1] '(1) {:1 1} #{1}]) ;;=> true。但是一个空集合也会返回自己nil,那么使用seq 来测试集合的空性有什么意义呢?

【问题讨论】:

  • (= () nil) ---> false
  • 空集合不会返回nil。您可能正在考虑 nil-punning,它在另一个方向起作用:如果您有 nil 并且您正在寻找一个序列,它将充当一个空序列。 但反之亦然。在other lisps 中,您的里程会有所不同:空集合与 nil 不同。 Clojure 不等同于 nil 和 '()。

标签: clojure seq


【解决方案1】:

空集合不是假的,所以在测试中它是否为空并不重要:

(if '() "a" "b")
=> "a"

所以如果你想在它为空的情况下做其他事情:

(if (seq '()) "a" "b")
=> "b"

【讨论】:

    【解决方案2】:

    来自该页面顶部的文档:

    seq 也适用于字符串、本地 Java 数组(引用类型)和 任何实现 Iterable 的对象

    因此,使用 seq 测试空性适用于任何这些集合类型。因此,您可以获得一种一致的惯用方式来检查任何这些类型的空虚,如示例所示。

    seq 在空集合和 nil 上都返回 nil 的事实也使得检查更简单,而不是需要检查空或 nil。

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多