获取clojure中对象类型的“默认值”?

时间:2017-03-08 03:07:11

标签: clojure

我希望根据clojure中的类型获取对象的“默认值”。例如,它可能会这样工作:

(default-value 15) ;; => 0
(default-value "hi") ;; => ""

在这两种情况下,它都采用值的类型,并返回该值类型的“空白”实例。我能想到的最好的是

(defn default-value [x] (.newInstance (.getClass x)))

但这不适用于数字:

repl=> (.newInstance (.getClass 1))

NoSuchMethodException java.lang.Long.<init>()  java.lang.Class.getConstructor0 (Class.java:3082)

2 个答案:

答案 0 :(得分:3)

看起来多方法可能很合适:

(defmulti   getNominalInstance (fn [obj] (.getClass obj)))
(defmethod  getNominalInstance java.lang.Long   [obj] (Long. 0))
(defmethod  getNominalInstance java.lang.String [obj] "")

(prn :long    (getNominalInstance 5))
(prn :string  (getNominalInstance "hello"))

;=> :long 0
;=> :string ""

问题是Long只有2个构造函数,它们分别采用原始long或字符串。

Long(long value) - Constructs a newly allocated Long object 
that represents the specified long argument.

Long(String s) - Constructs a newly allocated Long object 
that represents the long value indicated by the String parameter.

说{&#34;新的Long()&#34;这是合法的Java,这是newInstance()的作用。因此,您必须使用defmulti或同等程序手动执行此操作。

答案 1 :(得分:2)

并不存在&#34;默认值&#34;对于一个类型,除非您正在寻找Java默认初始化构造函数中的东西的方式,当您不提供显式值时。那只是:

  • 布尔=&GT;假
  • 数=大于0
  • 对象=&GT;空

如果你想要更复杂的东西(例如,string =&gt;&#34;&#34;)你将不得不自己编写,通过以某种方式将对象的类型分派到你控制的代码中。