3

此功能有效,但我正在学习 Clojure 并想知道是否有更好/更清洁的方法来编写:

;; loop over methods, update the scripts map, and return scripts

(defn update-scripts
  [filename]
  (loop [scripts {}
         methods (get-methods filename)]
    (if (seq methods)
      (let [method (first methods)
            sig (get-method-signature method)
            name (get-method-name sig)]
        (recur (assoc scripts name {:sig sig, :method method})
               (rest methods)))
      scripts)))


(update-scripts "gremlin.groovy")

更新:这是我最终使用的:

(defn- update-scripts
  [scripts method]
  (let [sig (get-method-signature method)
        name (get-method-name sig)]
    (assoc scripts name {:sig sig :method method})))

(defn get-scripts
  [filename]
  (reduce update-scripts {} (get-methods filename)))
4

3 回答 3

4
(defn update-scripts
  [filename]
  (into {} (map (fn [m] [ (get-method-name (get-method-signature m)) {:sig (get-method-signature m), :method m}  ] ) (get-methods filename) )))
于 2012-05-10T12:40:52.890 回答
2

我会用一个 reduce 来做到这一点,如下所示:

(defn update-scripts
  [filename]
  (reduce (fn [scripts method]
            (let [sig (get-method-signature method)
                  name (get-method-name sig)]
              (assoc scripts name {:sig sig :method method})))
          {}
          (get-methods filename)))

当我必须收集一个集合并返回一个不同类型的集合时,这是我遵循的“模式”。这里我们有一个方法列表,我们想把这个列表转换成一个映射(在对其进行一些处理之后)。我觉得 reduce 是最易读的方法。

于 2012-05-10T12:23:35.847 回答
2

我将使用map为返回的每个条目构建一个哈希映射,get-methods然后将merge所有这些哈希映射合为一个。

(defn update-scripts
  [filename]
  (apply merge
         (map
          #(hash-map (get-method-name %) {:sig (get-method-signature %) :method %})
          (get-methods filename))))

通常,最好使用标准的序列操作函数,例如 等mapfilter而不是loop.

于 2012-05-10T12:40:03.327 回答