获得;默认值";对象的';clojure是什么类型的?

获得;默认值";对象的';clojure是什么类型的?,clojure,Clojure,我想根据clojure中的对象类型获取对象的“默认值”。例如,它可能是这样工作的: (default-value 15) ;; => 0 (default-value "hi") ;; => "" 在这两种情况下,它都采用该值的类型,并返回该值类型的“空白”实例。我能想出的最好办法是 (defn default-value [x] (.newInstance (.getClass x))) 但这对数字不起作用: repl=> (.newInstance (.getClass

我想根据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)
repl=>(.newInstance(.getClass 1))
NoSuchMethodException java.lang.Long.()java.lang.Class.getConstructor0(Class.java:3082)

对于一个类型来说,实际上没有“默认值”这样的东西,除非您正在寻找Java默认值在没有提供显式值的情况下初始化构造函数中内容的方式。那只是:

  • 布尔=>false
  • 数字=>0
  • 对象=>null

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

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

  • 布尔=>false
  • 数字=>0
  • 对象=>null

如果您想要更复杂的东西(例如,string=>“”),您必须自己编写,方法是以某种方式将对象的类型分配到您控制的代码中。

看起来多方法可能非常适合:

(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   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
或等效工具手动执行此操作。

数字“默认”值取决于数字的使用方式。0表示加法,1表示乘法。数字的“默认”值取决于数字的使用方式。例如,0表示加法,1表示乘法。我最终选择了这条路线,除了我使用了
defprotocol
extend protocol
而不是多个方法,因为它们适用于这样的基于单参数类型的分派情况,我最终选择了这条路线,除了我使用了
defprotocol
extend protocol
而不是多个方法之外,因为它们是用于单参数类型的分派情况,就像这样。Clojure没有“默认值”的概念对于一个类型,如果你想要的话,你可以创建一个条件来实现它。同意-Clojure没有类型的“默认值”概念,所以如果你想要的话,你可以创建一个条件来实现它。