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

欢迎!请查阅 关于 页面以获取有关如何使用本站的一些更多信息。

0
语法和读取器

您好,亲爱的大Clojure社区成员!
“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 是一个可变变量吗??
是的,atoms 提供了受控可变性——在应用函数更新前值时线程安全。还可以参考 Refs 和 Agents - https://clojure.org/reference/refs 以及 https://clojure.org/reference/agents
谢谢!:-)
0

完全忽略 atoms,以下是对 keywords 的非正式见解

我一般将 keywords 想象成一个具有特殊超级力量的字符串/符号混合体。像 symbols一样,它们受限于某些字符(特别是不允许空格)并且可以具有命名空间::myproject.api/foo。像字符串一样,它们实际上只是一种数据原始类型。

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

以下是一个关于 why keywords 为什么存在在 Clojure 中的有帮助的 StackOverflow 回答:https://stackoverflow.com/a/11655615

by
谢谢!:-)
...