【问题标题】:Clojure extracting value from map based on prioritized logicClojure基于优先逻辑从地图中提取价值
【发布时间】:2012-02-20 15:14:29
【问题描述】:

我有一个函数想要根据优先顺序从地图中提取一个值。目前我正在将它作为一个嵌套的 if 结构来做,这太可怕了。我必须相信有更好的方法。

虽然这可行,但有更好的方法吗?

(defn filter-relatives [relatives]
    (if(contains? relatives :self)
         (relatives :self)
             (if(contains? relatives :north)
                 (relatives :north)
                     (if(contains? relatives :west)
                         (relatives :west)
                         (if(contains? relatives :east)
                             (relatives :east)
                             (relatives :south)
                         )
                     )
                 )
              )
          )
    )
)

【问题讨论】:

    标签: map filter clojure conditional


    【解决方案1】:
    (some relatives [:self :north :west :east :south])
    

    【讨论】:

    • ...除非您还想获取 nil 值。
    • ...或false。如果这是一个问题,请参阅我的答案进行适当的调整,否则一定要使用这个。
    • 作为一般规则,我们应该提供最简单的惯用 clojure 代码来解决所提出的问题。边缘情况可以随后处理。 “聪明”很可能会隐藏更好、更通用的解决方案,从而导致缺乏经验的人养成坏习惯。
    • 嗯,当然,但谁说别的呢? (如果您认为我以某种方式做到了,请注意我上面评论中的“否则肯定使用这个”部分,以及我回答的第一句话。)在这种特殊情况下,可能更好的解决方案(即这一个)不是更通用的,所以我想说最好指出它的局限性,以免导致没有经验的开发人员在不考虑这些限制的情况下使用它,也许在以下情况下这些实际上很重要。
    【解决方案2】:

    怎么样:

    (defn filter-relatives [relatives ordered-filters] 
        (first (filter identity (map relatives ordered-filters))))
    

    示例运行:

    user=> (filter-relatives {:a 1 :b 2 :c 3} [:z :b :a])                                                               
    2
    

    【讨论】:

      【解决方案3】:

      如果nilfalse 不在可能的值中,则其他答案很好。如果是的话,你可以使用类似的东西

      (if-let [e (some (partial find relatives)
                       [:self :north :west :east :south])]
        (val e)
        :no-key-found)
      

      例如

      (if-let [e (some (partial find relatives)
                       [:self :north :west :east :south])]
        (val e)
        :no-key-found)
      ; => false
      
      (if-let [e (some (partial find {})
                       [:self :north :west :east :south])]
        (val e)
        :no-key-found)
      ; => :no-key-found
      

      【讨论】:

        【解决方案4】:
        (first (keep relatives [:self :north :west :east :south]))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-02
          相关资源
          最近更新 更多