Clojure中的组合方法

马克·卡波夫

假设我们有一个多重方法foo它有几个实现。比方说,其中一人时的参数被称为foo是一个包含字符的字符串\r,当争论的另一个执行foo是包含字符的字符串\!伪代码:

(defmulti foo ???) ; can't come up with function..

(defmethod foo \r [_]
  (println "one"))

(defmethod foo \! [_]
  (println "two"))

因此,当我们这样调用函数时:

(foo "right!") ;; desired output:
one
two
;; => nil

这里重要的是,受支持的方法列表应该不是固定的,而是可以扩展的,因此以后可以添加新方法而无需触及原始代码。

尽管最近几天我提高了Clojure的技能,但我仍然缺乏经验。我最好的主意是将一对地图保留为“字符-功能”,然后手动遍历它并执行正确的功能。在这种情况下,我还需要一些接口来注册新功能,等等。什么是惯用的解决方案?

灵魂检查

我认为多重方法无法像您期望的那样起作用。

那就是:对于一次多方法调用,多方法中的调度仅被调用一次,因此,除非您定义一个实现,否则无法获得您期望的结果(将“正确”打印为“一个”和“两个”)。实际上处理在输入字符串中同时包含\r的情况,\!并输出所需的输出。

这将不容易扩展。

实现您想要的更好的方法是通过迭代输入字符串来显式地进行多个调用:

; You want the dispatch function to just return the character passed to it.
(defmulti foo identity) 

; The argument list here is mandatory, but we don't use them at all, hence '_'
(defmethod foo \r [_] 
  (println "one"))

(defmethod foo \! [_]
  (println "two"))


; You need the default case for all the other characters
(defmethod foo :default [_]
  ())

; Iterates the string and executes foo for each character
(defn bar [s] 
    (doseq [x s] 
        (foo x)))

所以打电话

(bar "right!") 

将打印:

one
two

编辑

如果您需要访问多方法主体内的整个字符串,则将其与字符一起显式传递:

; You want the dispatch function to just return the character passed to it as the first arg.
(defmulti foo (fn [c _] c)) 


(defmethod foo \r [c s] 
  (println "one"))

(defmethod foo \! [c s]
  (println "two"))

; The default now takes two arguments which we ignore
(defmethod foo :default [_ _] ())

; Iterates the string and executes foo for each character
(defn bar [s] 
    (doseq [x s] 
        (foo x s)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Clojure中的定点组合器

来自分类Dev

Clojure /跷跷板中组合框的所有选项

来自分类Dev

在$ routeProvider中组合.when()方法

来自分类Dev

建议Clojure中的协议方法

来自分类Dev

在Elasticsearch查询中组合AND和OR的最佳方法

来自分类Dev

将功能组合到方法中

来自分类Dev

如何从组合框事件中调用方法

来自分类Dev

在if条件中组合2个方法调用

来自分类Dev

java中取列组合的方法

来自分类Dev

在Clojure中编写条件代码的正确方法

来自分类Dev

Clojure中的库函数与Java方法

来自分类Dev

Clojure:从符号列表中定义多重方法?

来自分类Dev

在Clojure中管理资源池的最佳方法

来自分类Dev

在Clojure宏中评估符号的正确方法

来自分类Dev

在Clojure宏中评估符号的正确方法

来自分类Dev

Clojure中的.split方法返回意外结果

来自分类Dev

在Clojure中调用Java非静态方法

来自分类Dev

R中的组合的组合

来自分类Dev

xml中的parse方法在Clojure中引发IllegalArgumentException

来自分类Dev

尾递归Clojure函数用于计算组合

来自分类Dev

Clojure:运行时的函数组合

来自分类Dev

在Clojure spec中将s / and与s / or组合

来自分类Dev

尾递归Clojure函数,用于计算组合

来自分类Dev

从 R 中的多个列表“组合”多元素索引的所有组合的更好方法?

来自分类Dev

组中的组合组合

来自分类Dev

在SWT / JFace中实现多选组合的最佳方法是什么?

来自分类Dev

.sort中组合比较运算符(<=>)的替代方法

来自分类Dev

Python中带宽方法的投资组合重新平衡

来自分类Dev

在字典键中组合子字符串的方法