在下面的例子(從Programming Clojure, 2nd ed書採取::標籤元數據的Clojure
(defn ^{:tag String} shout [^{:tag String} s] (.toUpperCase s))
什麼是的值:標籤元 做一個:
((map #'shout) :tag)
產量java.lang.String但是如果我無法區分輸入和輸出參數,究竟傳達了什麼信息?
在下面的例子(從Programming Clojure, 2nd ed書採取::標籤元數據的Clojure
(defn ^{:tag String} shout [^{:tag String} s] (.toUpperCase s))
什麼是的值:標籤元 做一個:
((map #'shout) :tag)
產量java.lang.String但是如果我無法區分輸入和輸出參數,究竟傳達了什麼信息?
:標籤元數據的價值是什麼?
我發現Clojure的正式文件
^String obj - Sets the value of :tag key in the object’s metadata.
Equivalent to ^{:tag java.lang.String} obj
Used to hint an objects type to the Clojure compiler.
See Java Interop:
Type Hints for more information and a complete list of special type hints.
Clojure supports the use of type hints to assist the compiler
in avoiding reflection in performance-critical areas of code.
究竟是什麼,如果我不能輸入和輸出PARAMS區分信息傳送?
您不需要指定輸入或輸出參數的類型。而且,如果沒有指定,clojure將通過反射執行該功能(根據此描述)。
還有另一個blog post。 根據這篇文章,Clojure使用IFn接口來創建Clojure代碼創建的所有方法。
IFn defines all arguments of .invoke to be of type Object.
So you can pass anything you like to a Clojure function.
It doesn't matter which type it is, because everything is an Object anyway.
所以,我想打電話給Clojure的方法,而類型提示和調用Java的反射.invoke
是相同的。
我有同樣的問題在閱讀這有小幅更新,例如編程的Clojure第三版:
(defn ^{:tag String} shout [^{:tag String} s] (clojure.string/upper-case s))
這相當於簡稱:
; I guess tags and type hints are equivalent
(defn ^String shout [^String s] (clojure.string/upper-case s))
像你所說,如果如果標籤引用輸入或輸出參數,則查找函數元數據時模糊不清:
(meta #'shout)
...返回
{:tag java.lang.String,
:arglists ([s]),
etc... }
如果你仔細想想,它必須是返回類型,因爲一個函數可以有N個參數,但Clojure中不允許多個返回值。元數據中的:標記不是矢量,而是單個值。
如果你確實需要編程的功能參數的標識符/類型提示,你可以呼籲元功能:arglists如下所示: