ClojureScript - 在地图中存储函数
ClojureScript - store functions in map
我正在使用映射来存储函数调用(在 ClojureScript 中,但在 Clojure 中应该是相同的):
(def parse-fn {:json js/JSON.parse
:edn read-string
:transit t->clj})
然后我有一个 transform
函数,如下所示:
(defn transform [format data]
((get parse-fn format) data))
这样调用 transform
: (transform :transit data)
效果很好。我只担心 transform
函数的可读性。首先是一个函数并不是很明显。
编辑: 我不能只调用 (:transit parse-fn)
因为 format
来自另一个函数,如:(another-fn [... format ...] ... (transform format data))
是否有显式的 call
函数,或者这段代码的结构是否不符合惯例?
也许可以考虑将关键字作为函数处理。
((:transit parse-fn) data)
对我来说,更简洁的方法有助于我将第一个元素识别为不同的。
或者,您可以将映射视为函数。
((parse-fn :transit) data)
据我了解,第一种方法通常被认为更惯用,它也可以 be optimized more intelligently。
您的初始设计完全可读。将函数传递给执行实际工作的其他函数是一种相当正常的做事方式。我认为您不需要将任何内容更改为 "make it more readable"。如果我要更改任何内容以使我更清晰地表达出来,那就是将 transform 的名称更改为 transform-lookup 或 get-transform
(another-fn [... format ...] ... (transform-lookup format data))
或
(another-fn [... format ...] ... (get-transform format data))
虽然这是一个非常小的区别,但它很好。
我正在使用映射来存储函数调用(在 ClojureScript 中,但在 Clojure 中应该是相同的):
(def parse-fn {:json js/JSON.parse
:edn read-string
:transit t->clj})
然后我有一个 transform
函数,如下所示:
(defn transform [format data]
((get parse-fn format) data))
这样调用 transform
: (transform :transit data)
效果很好。我只担心 transform
函数的可读性。首先是一个函数并不是很明显。
编辑: 我不能只调用 (:transit parse-fn)
因为 format
来自另一个函数,如:(another-fn [... format ...] ... (transform format data))
是否有显式的 call
函数,或者这段代码的结构是否不符合惯例?
也许可以考虑将关键字作为函数处理。
((:transit parse-fn) data)
对我来说,更简洁的方法有助于我将第一个元素识别为不同的。
或者,您可以将映射视为函数。
((parse-fn :transit) data)
据我了解,第一种方法通常被认为更惯用,它也可以 be optimized more intelligently。
您的初始设计完全可读。将函数传递给执行实际工作的其他函数是一种相当正常的做事方式。我认为您不需要将任何内容更改为 "make it more readable"。如果我要更改任何内容以使我更清晰地表达出来,那就是将 transform 的名称更改为 transform-lookup 或 get-transform
(another-fn [... format ...] ... (transform-lookup format data))
或
(another-fn [... format ...] ... (get-transform format data))
虽然这是一个非常小的区别,但它很好。