【问题标题】:Issue with Clojure 'contains'Clojure“包含”的问题
【发布时间】:2012-08-11 09:18:12
【问题描述】:

我正在使用 Closure Box 浏览一些 Clojure 教程,并输入了以下代码:

user> (def stooges (vector "Moe" "Larry" "Curly"))
#'user/stooges
user> (contains? stooges "Moe")
false

这不应该评估为 TRUE 吗?任何帮助表示赞赏。

【问题讨论】:

  • contains? 回答了这个问题:“调用get 会给我一个实际在集合中的值吗?”包含nilfalse 的集合的一个重要区别。

标签: vector clojure contains


【解决方案1】:

这是一个常见的陷阱!我记得当我开始使用 Clojure 时,我陷入了这个 :-)

contains? 检查集合中是否存在索引(0、1、2 等)。

你可能想要这样的东西:

(some #{"Moe"} stooges)
=> "Moe"    <counts as boolean true>

(some #{"Fred"} stooges)
=> nil      <counts as boolean false>

或者您可以定义自己的版本,例如:

(defn contains-value? [element coll]
  (boolean (some #(= element %) coll)))

(contains-value? "Moe" stooges)
=> true

【讨论】:

  • 非常好。这真的很有用。谢谢。
【解决方案2】:

向量类似于数组。如果集合中存在 keycontains? 将返回 true。您应该寻找“键/索引”0、1 或 2

user=> (def stooges (vector "Moe" "Larry" "Curly"))
#'user/stooges
user=> (contains? stooges 1)
true
user=> (contains? stooges 5)    
false

如果您使用的是哈希...

user=> (def stooges {:moe "Moe" :larry "Larry" :curly "Curly"})
#'user/stooges
user=> (contains? stooges :moe)
true
user=> (contains? stooges :foo)
false

正如 mikera 建议的那样,您可能想要clojure.core/some 之类的东西

【讨论】:

  • 我明白了。谢谢你的帮助。当我改用一个集合时,我试图做的事情是有效的。
【解决方案3】:

包含?支持Set,如果你使用clojure-1.4

user=> (contains? #{:a, :b} :a)
true

user=> (contains? (set stooges) "Moe")
true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 2010-09-08
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多