Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义函数时,Clojure中的“^”是什么?_Clojure - Fatal编程技术网

定义函数时,Clojure中的“^”是什么?

定义函数时,Clojure中的“^”是什么?,clojure,Clojure,我是Clojure的新手,我在Clojure被搞砸了 我目前正在阅读Jepsen的clojure代码,该代码用于测试分布式数据库的一致性 你可以找到代码。 第50行有一个^MongoDatabase。或: 我不知道它是什么,因为此函数中从未使用过^MongoDatabase或MongoCollection 谁能给我一些帮助吗。非常感谢。在本文中,这是一个类型提示,表示collection应该返回MongoCollection实例,dbarg应该是MongoDatabase实例。出于性能原因,这非

我是Clojure的新手,我在Clojure被搞砸了 我目前正在阅读Jepsen的clojure代码,该代码用于测试分布式数据库的一致性

你可以找到代码。 第50行有一个^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]}