首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试剂/原子在REPL的行为?

试剂/原子在REPL的行为?
EN

Stack Overflow用户
提问于 2020-02-09 21:29:53
回答 1查看 55关注 0票数 1

正在寻找reagent/atom行为的澄清。

这是专业Clojure一书中的代码,第5章,运行着figwheel:

deps中的试剂版本为0.8.1

代码语言:javascript
复制
(ns whip.core
    (:require [reagent.core :as reagent :refer [atom]]))

(defonce app-state                                          
  (reagent/atom
    {:projects                
     {"aaa"                   
      {:title "Build Whip"
       :stories
       {1 {:title "Design a data model for projects and stories"    
           :status "done"                                           
           :order 1}                                                
        2 {:title "Create a story title entry form"                 
           :order 2}                                                
        3 {:title "Implement a way to finish stories"
           :order 3}}}}}))

(defn project-board [app-state project-id]                          
  (into [:ul]
    (for [[id {:keys [title]}] (get-in @app-state [:projects project-id :stories])]
      [:li title])))

在REPL中,如果我将deref'd app-state传递给project-board,我会得到一个错误:

代码语言:javascript
复制
dev:whip.core=> (project-board @app-state "aaa")
#object[Error Error: No protocol method IDeref.-deref defined for type cljs.core/PersistentArrayMap: {:projects {"aaa" {:title "Build Whip", :stories {1 {:title "Design a data model for projects and stories", :status "done", :order 1}, 2 {:title "Create a story title entry form", :order 2}, 3 {:title "Implement a way to finish stories", :order 3}}}}}]
   cljs.core/missing-protocol (jar:file:/Users/m/.m2/repository/org/clojure/clojurescript/1.10.520/clojurescript-1.10.520.jar!/cljs/core.cljs:316:4)
   cljs.core/-deref (jar:file:/Users/m/.m2/repository/org/clojure/clojurescript/1.10.520/clojurescript-1.10.520.jar!/cljs/core.cljs:671:1)
   cljs$core$deref (jar:file:/Users/m/.m2/repository/org/clojure/clojurescript/1.10.520/clojurescript-1.10.520.jar!/cljs/core.cljs:1452:4)
   whip.core.project_board_reagentRender (file:/Users/m/clj-pro-clojure/code-and-notes/whip/src/whip/core.cljs:62:3)

但是如果我传递普通的var app-state

代码语言:javascript
复制
dev:whip.core=> (project-board app-state "aaa")
[:ul
 [:li "Design a data model for projects and stories"]
 [:li "Create a story title entry form"]
 [:li "Implement a way to finish stories"]]

如果我在repl中打印普通的var app-state,它会打印出来:

代码语言:javascript
复制
dev:whip.core=> app-state
#<Atom: {:projects {"aaa" {:title "Build Whip", :stories {1 {:title "Design a data model for projects and stories", :status "done", :order 1}, 2 {:title "Create a story title entry form", :order 2}, 3 {:title "Implement a way to finish stories", :order 3}}}}}>

如果我在repl输出deref'd var app-state,它也会打印出来,但现在语法缩进了:

代码语言:javascript
复制
dev:whip.core=> @app-state
{:projects
 {"aaa"
  {:title "Build Whip",
   :stories
   {1
    {:title "Design a data model for projects and stories",
     :status "done",
     :order 1},
    2 {:title "Create a story title entry form", :order 2},
    3 {:title "Implement a way to finish stories", :order 3}}}}}

为什么第一个案例失败了?(如果某样东西是一个原子,我不应该期望总是破坏它吗?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-10 03:43:56

在第一种情况下,您尝试deref两次,这就是它失败的原因。

代码语言:javascript
复制
(project-board @app-state "aaa")

意味着project-board fn现在接收一个映射作为参数,而不是原子。因此,由于映射到未实现deref协议,因此(get-in @app-state ...)失败。

代码语言:javascript
复制
No protocol method IDeref.-deref defined for type cljs.core/PersistentArrayMap
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60137137

复制
相关文章

相似问题

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