gpt4 book ai didi

clojure - clojure 中具有相同名称的多个函数

转载 作者:行者123 更新时间:2023-12-05 08:34:31 29 4
gpt4 key购买 nike

(defn hi[](+ 5 6))  
(hi)
(defn hi[](+ 6 7))
(hi)

你好,我是 clojure 的新手。如上所述,我编写了两个具有相同名称的函数。我们可以在 clojure 中为多个函数使用相同的名称吗?如果是,它是否在相同的命名空间内发生冲突?

最佳答案

同一命名空间中不能有多个同名函数。如果您定义函数 foo 然后再次重新定义它,新版本将替换旧版本。

不太清楚您要实现的目标,但 Clojure 有很多方法可以在同一个名称下实现多个实现。

Arity 调度

您可以在 arity 上调度函数:

(defn foo
([x] :version-one)
([x y] :version-two)
([x y & more] :version-tree))

同一个函数的不同类型可以相互调用,这有点相当于有多个同名函数。

多方法

您可以使用多重方法进行分派(dispatch)。它们允许您定义一个将根据参数调用的函数,其结果将用于调度。

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

协议(protocol)

这种技术类似于其他语言中的多态性。您可以按参数类型分派(dispatch)。这是示例:

(defprotocol foo
(my-fnc [x] "description..."))

(extend-protocol foo
Number
(my-fnc [x] :number-version)
String
(my-fnc [x] :string-version))

Multimethods 是最强大的工具,你可以用它们来模拟协议(protocol):

(defmulti foo class)

关于clojure - clojure 中具有相同名称的多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25522802/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com