基于Clojure中参数类型的规范化返回方法
如果参数是符号,则返回它。如果参数是列表,请调用另一个方法 Clojure新手,无法找到规范的方法。在Python中,可以执行以下操作:基于Clojure中参数类型的规范化返回方法,clojure,Clojure,如果参数是符号,则返回它。如果参数是列表,请调用另一个方法 Clojure新手,无法找到规范的方法。在Python中,可以执行以下操作: def返回参数类型(参数): 如果类型(arg)为str: 返回参数 如果类型(arg)为列表: 返回另一个_方法(arg) 可能我可以使用多种方法,但如何匹配参数的类型,以及在Clojure中匹配类型是否可以接受?不确定目标,但这应该是可行的: (defn something [arg] (cond (str? arg) arg (l
def返回参数类型(参数):
如果类型(arg)为str:
返回参数
如果类型(arg)为列表:
返回另一个_方法(arg)
可能我可以使用多种方法,但如何匹配参数的类型,以及在Clojure中匹配类型是否可以接受?不确定目标,但这应该是可行的:
(defn something [arg]
(cond
(str? arg) arg
(list? arg) (other-fn arg)))
可以在Clojure中检查类型。它不是一种非类型语言 如果您需要一个简单的分派机制,Alan提出的代码就是惯用的IMHO。 这里还有其他的可能性。你已经提到了一个:多种方法。 你的例子可以写成
(defmulti something class [arg])
(defmethod something String [arg] arg)
(defmethod something java.util.List [arg] (some-other arg))
在这种情况下,调度fn是类
,但您可以实现任何类型的调度条件
还有
clojure.match
,一个通用的匹配库(以及其他库)。请参见Clojure中基本上有3种分派方法:
cond
与谓词(即返回true或false且名称通常以?
结尾的方法)结合使用查看有关多方法与协议的简短讨论。除了使用多方法或方法进行显式检查外,还可以使用协议分派第一个参数的类型:
(defprotocol OnArgTypeReturner
(return-on-arg-type [arg]))
(extend-protocol OnArgTypeReturner
String
(return-on-arg-type [arg] arg)
clojure.lang.IPersistentList
(return-on-arg-type [arg] "another-method-called"))
(return-on-arg-type "foo")
;; => "foo"
(return-on-arg-type '(1 2 3))
;; => "another-method-called"
它起作用了!问题的另一部分是:是否有更好的方法(对语言来说更惯用)来做同样的事情?
cond
已经足够惯用了。您也可以尝试cond->
这完全是惯用的,因为它非常简单和明显。非玩具问题可能需要协议或多方法,但事实并非如此。