繁体   English   中英

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

[英]Get the “default value” of an object's type in 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)

看起来多方法可能是一个很好的选择:

(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.

Java说“ new Long()”是不合法的,这是newInstance()作用。 因此,您必须使用defmulti或等效方法手动进行defmulti

类型实际上没有任何“默认值”之类的东西,除非您正在寻找不提供显式值时Java默认初始化构造函数中内容的方式。 就是这样:

  • 布尔=>假
  • 数字=> 0
  • object => null

如果您想要更复杂的内容(例如string =>“”),则必须通过将对象的类型以某种方式分派到您控制的代码中来自己编写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM