首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在映射键/值上设置保护的Core.match

在映射键/值上设置保护的Core.match
EN

Stack Overflow用户
提问于 2019-10-13 22:44:11
回答 1查看 328关注 0票数 1

是否可以使用core.match来执行以下操作(愚蠢的示例):

代码语言:javascript
复制
  (defn summaries-film [film]
     (match film
         {:genre "Horror" :budget :guard #(< % 1000000) :star _} "Low budget horror"
         {:genre "Comedy" :budget _ :star "Adam Sandler"} "Trash"
         {:genre _ :budget _ :star "Emily Blunt"} "5 Stars"
         :else "Some other film"))

??

我希望能够在地图上进行模式匹配,但是有:guard #(< % 10000)位吗?也就是说,根据映射中键的值在模式中有一个函数吗?

这是可能的,我知道我可以在向量上这样做,但是不能计算出语法,如果可能的话,用映射。

我知道我可以使用析构,但我想知道是否可以通过模式匹配。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-14 01:38:40

虽然语法不同,但您可以在映射中使用卫兵。将模式包装在一个列表中,并追加:guard your-guard-fn。如果模式不匹配,则将使用整个映射调用保护函数:

代码语言:javascript
复制
({:foo 1} :guard #(= 1 (:foo %)))

下面是您的示例:

代码语言:javascript
复制
(defn summaries-film [film]
  (match film
    ({:genre "Horror" :budget _ :star _} :guard #(< (:budget %) 100)) "Low budget horror"
    {:genre "Comedy" :budget _ :star "Adam Sandler"} "Trash"
    {:genre _ :budget _ :star "Emily Blunt"} "5 Stars"
    :else "Some other film"))

(summaries-film {:genre "Horror" :budget 1 :star "Kelsey Grammer"})
;=> "Low budget horror"
(summaries-film {:genre "Horror" :budget 101 :star "Robert Forster"})
;=> "Some other film"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58368338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档