定义函数时,Clojure中的“^”是什么?
我是Clojure的新手,我在Clojure被搞砸了 我目前正在阅读Jepsen的clojure代码,该代码用于测试分布式数据库的一致性 你可以找到代码。 第50行有一个^MongoDatabase。或: 我不知道它是什么,因为此函数中从未使用过定义函数时,Clojure中的“^”是什么?,clojure,Clojure,我是Clojure的新手,我在Clojure被搞砸了 我目前正在阅读Jepsen的clojure代码,该代码用于测试分布式数据库的一致性 你可以找到代码。 第50行有一个^MongoDatabase。或: 我不知道它是什么,因为此函数中从未使用过^MongoDatabase或MongoCollection 谁能给我一些帮助吗。非常感谢。在本文中,这是一个类型提示,表示collection应该返回MongoCollection实例,dbarg应该是MongoDatabase实例。出于性能原因,这非
^MongoDatabase
或MongoCollection
谁能给我一些帮助吗。非常感谢。在本文中,这是一个类型提示,表示collection
应该返回MongoCollection
实例,db
arg应该是MongoDatabase
实例。出于性能原因,这非常有用,以避免不必要的反射
更多信息,请参阅
^
的另一个用法是用于类型提示。它们用于告诉编译器值将是什么类型,并允许编译器执行特定于类型的优化,从而潜在地加快生成代码的速度:
要注意的另一点是,类型提示可能具有欺骗性(即,它们没有“强制”或“警告”实用程序):
通常,我会避免使用类型提示,因为它们很少是必需的(除非处理低级Java代码)。在Clojure中使用cap符号有两个目的 第一个用于类型提示。声明函数时,可以按如下方式标记参数的类型或结果值:
(defn ^String concat-strings
[^String a ^String b]
(str a b))
类型提示帮助编译器执行一些优化
使用cap的第二个选项是在声明元数据时。元数据可以是布尔标志或映射。例如:
(def ^:private secret "test")
现在,上面的变量被标记为private,因此其他名称空间无法使用它
下面是一个元映射使用示例:
(def ^{:private true
:doc "My super secret password"
:added "product-version"}
secret
"test")
让我们尝试读取该变量的元数据:
(meta #'secret)
返回
{:private true,
:doc "My super secret password",
:added "product-version",
:line 70,
:column 7,
:file "*cider-repl localhost*",
:name secret,
:ns #namespace[user]}
太棒了,这帮了大忙!
(meta #'secret)
{:private true,
:doc "My super secret password",
:added "product-version",
:line 70,
:column 7,
:file "*cider-repl localhost*",
:name secret,
:ns #namespace[user]}