获得;默认值";对象的';clojure是什么类型的?
我想根据clojure中的对象类型获取对象的“默认值”。例如,它可能是这样工作的:获得;默认值";对象的';clojure是什么类型的?,clojure,Clojure,我想根据clojure中的对象类型获取对象的“默认值”。例如,它可能是这样工作的: (default-value 15) ;; => 0 (default-value "hi") ;; => "" 在这两种情况下,它都采用该值的类型,并返回该值类型的“空白”实例。我能想出的最好办法是 (defn default-value [x] (.newInstance (.getClass x))) 但这对数字不起作用: repl=> (.newInstance (.getClass
(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没有类型的“默认值”概念,所以如果你想要的话,你可以创建一个条件来实现它。