我使用以下命令创建了一个新的 Compojure Leiningen 项目lein new compojure test
。 Web 服务器运行于lein repl
进而
user=> (use 'ring.adapter.jetty)
user=> (run-jetty test.handler/app {:port 3000})
路由和应用程序处理程序规范很简单:
(defroutes app-routes
(GET "/*.do" [] "Dynamic page")
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
现在,在更改任何内容之后app-routes
定义(例如,将“动态页面”文本更改为其他内容,或修改 URI 匹配字符串),我没有在浏览器中获取更新的文本/路由。但是,当改变app-routes
定义略为
(defn dynfn [] "Dynamic page fn")
(defroutes app-routes
(GET "/*.do" [] (dynfn))
(route/not-found "Not Found"))
当更改返回值时,我确实得到了动态更新dynfn
。另外,遵循以下建议本文并修改app
定义为
(def app
(wrap-defaults #'app-routes site-defaults))
(注意#'
透明地创建一个 varapp-routes
)也有帮助!
为什么会这样?有没有其他方法可以让人们获得真正动态的行为defroutes
?
Thanks!
#'app-routes
是一个读取器宏,扩展为(var app-routes)
。当 var 像函数一样使用时,每次调用都会重新取消引用它,然后调用该取消引用返回的值。
如果你要供应app-routes
作为参数,编译器会将取消引用的值赋予wrap-defaults
,并且当 var 更新时,之前的值不会改变,因此更改 var 不会改变 的行为app
.
以下 repl 记录可能具有启发性:
user=> (defn foo [] "original")
#'user/foo
user=> (defn caller [f] #(f))
#'user/caller
user=> (def call-foo-value (caller foo))
#'user/call-foo-value
user=> (call-foo-value)
"original"
user=> (def call-foo-var (caller #'foo))
#'user/call-foo-var
user=> (call-foo-var)
"original"
user=> (defn foo [] "changed")
#'user/foo
user=> (call-foo-value)
"original"
user=> (call-foo-var)
"changed"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)