用于Clojure函数的Java的toString()等效

gon*_*one 9 java metadata clojure tostring

我正在使用的一些Java代码调用toString()我的Clojure函数对象,返回类似的内容#<ns$something something.something$something@7ce1eae7>>- 我想返回其他内容...大概有一种方法可以在函数中包含一些元数据,以便它们的对象toString()返回它?

sem*_*ros 12

如果您只想让REPL打印输出的对象更有意义,可以defmethod print-method为相关的类实现一个.

这是我最近编写的一些代码的缩短版本; 这使得Selenium-WebDriver WebDriver对象的REPL打印输出更有意义:

(defmethod print-method WebDriver
[o w]
(print-simple
 (str "#<" "Title: "    (.getTitle o) ", "
           "URL: "      (.getCurrentUrl o) " >")
  w))
Run Code Online (Sandbox Code Playgroud)

打印出像 #<Title: A Title, URL: http://example.com >

在这里,WebDriver代表一个类; 你可以很容易地通过实现内置Clojure的数据结构做print-method了相应的类(Clojure中的喜悦设有print-method用于clojure.lang.PersistentQueue其在默认情况下没有很好的表现).在o上面的是你正在处理的实际对象,w是一个作家(由这些类型的打印功能需要).

  • 我可以补充说,你真的不需要它的类,你可以使用(带有元数据{:type :: my-new-cool-type})和(defmethod print-method :: my-new-cool -type [ow] ...) (2认同)

Joo*_*aat 11

AFAIK,没有简单的方法可以做到这一点,尽管你可以使用reify或proxy来实现clojure.lang.IFn - 这实际上只相当于将你的函数对象包装在另一个对象中.

(def my-fn
  (let [f (fn [a] (println a))] 
     (reify clojure.lang.IFn
        (toString [this] "bla")
        (invoke [this a] (f a)))))


#'user/my-fn
user> my-fn
#<user$fn$reify__2903 bla>
user> (my-fn 2)
2
nil
user> (.toString my-fn)
"bla"
user> (str my-fn)
"bla"
Run Code Online (Sandbox Code Playgroud)