contains?
告诉您get
是否会成功。我还想认为get
会返回来自集合的内容,在本例中为set
。
(def all-match-okay #{
#{[3 0] [0 5]}
#{[2 4] [0 5]}})
(defn joinable? [b1 b2]
(let [in-a-set (set [b1 b2])
res (contains? all-match-okay in-a-set)]
res))
(defn join [b1 b2]
(let [in-a-set (set [b1 b2])
res (get all-match-okay in-a-set)]
(first res)))
(defn -main
[& args]
(println (joinable? [0 5] [3 0]))
(println (join [0 5] [3 0]))
)
如果您运行上述代码,则true
将从joinable?
返回,但[0 5]
将从join
返回。这意味着集合中的内容不会被返回,而是返回了匹配的内容。
我确定这里发生的事情在理论上是正确的(毕竟如果它们匹配则无论返回哪个都无关紧要)。但另一方面,返回集合中的实际内容在理论上也会很好。不是吗?
答案 0 :(得分:2)
问题是(first res)
电话。你得到一个集合的随机元素,因为它们没有被排序。一个(希望可重复的)例子:
(second (apply hash-set (range 32)))
=> 7 (instead of 1)
clojure.core附带sorted set。第三方库(例如flatland)提供有序集。