clojure - 为什么 "(def vowel? (set "aeiou"))"工作?

标签 clojure

我正在看优秀的 Clojure 教程 here .在其中一个示例中,它具有以下几行的 Clojure 代码:

(def vowel? (set "aeiou"))

这使得元音对元音返回真,对辅音返回假:
(vowel? (first "abc")) ; => true
(vowel? (first "cba")) ; => false

为什么是这样?我假设它与变量名称后面的问号有关。在教程中无法立即找到任何内容...

编辑 我才意识到 vowel?不返回 true 或 false,而是返回元素本身或 nil。看我自己的回答。

最佳答案

这与 map (Clojure 中最自然的对象)的工作方式非常相似。当映射作为函数调用时,它作为映射工作:

user=> (def ob {:foo "bar", :bar :baz, :qwerty 42})
#'user/ob
user=> (ob :foo)
"bar"

因此,可以将 Clojure 集作为函数调用并用作成员资格测试是有道理的。顺便说一句,如果你使用关键字(那些以冒号开头的东西)作为映射的键,它们也可以作为类似的功能,所以你可以这样做
user=> (:bar ob)
:baz

甚至与关键字集相同的事情:
user=> (def vowel-keywords (set [:a :e :i :o :u]))
#'user/vowel-keywords
user=> (:a vowel-keywords)
:a
user=> (:b vowel-keywords)
nil

但是,同样,后一种技巧仅适用于关键字,而不适用于您可能用作映射中的键或集合中的成员的任何其他内容。

关于clojure - 为什么 "(def vowel? (set "aeiou"))"工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686375/

相关文章:

clojure - 如何返回带有固定键和条件值的Clojure映射?

clojure - 更新原子以最小化内存使用的最佳方法是什么

clojure - 如何在Clojure中发音某些功能

dictionary - 如何在不知道 Clojure 中的键的情况下将映射分解为键值对?

clojure - 序列对换能器有什么作用?

macos - 在 OS X 上测试多个 mongodb 实例

clojure - 从 clojure 中的目录加载所有文件

Clojure 序列长度

clojure - Clojure STM 属于哪类事务模型?

clojure - 如何在重新框架中遍历订阅的集合并将数据显示为列表项?