(defn hi[](+ 5 6))
(hi)
(defn hi[](+ 6 7))
(hi)
Run Code Online (Sandbox Code Playgroud)
嗨,我是clojure的新手.如上所述,我写了两个同名的函数.我们可以在clojure中为多个函数使用相同的名称.如果是,它是否在相同的名称空间内冲突?
在同一名称空间中不能有多个具有相同名称的函数.如果您定义函数foo然后再次重新定义它,则较新的版本将替换旧版本.
目前还不是很清楚你想要实现什么,但Clojure有很多方法可以在一个名称下实现多个实现.
您可以在arity上调度函数:
(defn foo
([x] :version-one)
([x y] :version-two)
([x y & more] :version-tree))
Run Code Online (Sandbox Code Playgroud)
同一函数的不同arities可以相互调用,这有点等同于具有多个具有相同名称的函数.
您可以使用multimethods进行调度.它们允许您定义将在参数上调用的函数,其结果将用于调度.
(defmulti foo odd?)
(defmethod foo true [x]
(format "look, ma, %d is odd!" x))
(defmethod foo false [x]
(format "look, ma, %d is even!" x))
Run Code Online (Sandbox Code Playgroud)
这种技术类似于其他语言的多态性.您可以调度参数类型.这是一个例子:
(defprotocol foo
(my-fnc [x] "description..."))
(extend-protocol foo
Number
(my-fnc [x] :number-version)
String
(my-fnc [x] :string-version))
Run Code Online (Sandbox Code Playgroud)
多方法是最强大的工具,你可以用这种方式模拟协议:
(defmulti foo class)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |