2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多关于此信息的工作方式。

0
语法和读取器

亲爱的Clojurians,你好!
“keyword”和“atom”之间有什么区别?
抱歉,我是个完全的新手 :-)

2个答案

+2

被选定
 
最佳答案

关键词是符号标识符,它们求值为自身。它们常用于映射中的键来命名属性或作为枚举值。

例如,在映射{:first-name "SpongeBob", :last-name "SquarePants"}中,有两个条目使用了键:first-name:last-name

参考:https://clojure.org/reference/data_structures#Keywords

实心头目的是实际上持有可以由应用函数来原子性地更新已有值的值。例如,您可以用原子做一个计数器并递增它(如果需要在多个线程中安全地做的话)。

(def counter (atom 0))
(swap! counter inc) ;; increment counter
@counter ;; read counter: 1

参考:https://clojure.org/reference/atoms

那么……原子(Atom)是一个可变的变量吗?
是的,原子提供了受控的可变性——在应用函数更新时是线程安全的。参见参照(Refs)和代理(Agents)—— https://clojure.org/reference/refshttps://clojure.org/reference/agents
谢谢! :-)
0

完全忽略原子,关于关键词的非正式观点如下

我喜欢将关键词概念化为一种具有特殊能力的字符串/符号混合体。像符号一样,它们受到一定字符的限制(特别是不允许有空格)并可以分命名空间:`:myproject.api/foo`。像字符串一样,它们实际上只是数据原语。

关键词的主要超级能力是可以作为函数调用从关联数据结构(如哈希映射)中获取值:`(:foo {:foo 42 "bar" 36})` —— > `42` 和集合:`(:foo #{:foo :bar})` —— > `:foo`。不能使用字符串或数字作为函数。

这里有一个关于为什么Clojure中有关键词的StackOverflow的非常有帮助的回答:https://stackoverflow.com/a/11655615

谢谢! :-)
...