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

欢迎!请参阅关于页面以了解更多关于该功能的信息。

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

那么……原子变量是否是可变的?
是的,原子提供了可控的可变性— 在应用函数更新前一个值时是线程安全的。参见:参照(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

by
谢谢!:-)
...