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

欢迎!请查看关于页面,了解有关这些内容的更多信息。

0
语法和读取器

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

2 个答案

+2

已选
 
最佳答案

Keyword是符号标识符,它的值就是其自身。它们通常用作map中的键来命名属性或作为枚举值。

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

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

原子是实际上的盒子,它可以 hold 一个可以原子性地通过应用一个函数更新现有值的值。例如,你可以用原子制造一个计数器,然后增加它(如果需要,可以从多个线程安全地增加)。

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

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

那么……原子变量是可以变动的吗?
是的,原子提供了可控的可变性——当通过应用一个函数到先前值进行更新时,它是线程安全的。另请参阅引用和消息传递代理——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
谢谢!  :-)
...