我注意到一些库(例如 clojure-twitter)使用特殊的变量(用于动态绑定的变量,被星号包围)进行 oauth 身份验证。您将身份验证保存在 var 中,然后使用 (with-oauth myauth ..)。我认为这是解决此类问题的一个非常好的解决方案,因为您可以重新绑定authvar 对于应用程序的每个用户。
我在我一直在编写的电子邮件客户端中采取了类似的路线。我有一个特殊的变量名为session我将当前用户的会话和用户信息绑定到地图,并且有各种重要的函数使用该变量中的信息。我编写了一个宏 with-session 来在传递给 with-session 的一组表单的上下文中临时重新绑定它。事实证明这是一个非常干净的解决方案(对我来说)。
所以,我的问题是:我是否“按仪式行事”?这是一个糟糕的设计决策,还是这是特殊变量的预期用途之一?
你似乎做得完全正确。事实上,有许多内置 / contrib 宏的工作原理类似,例如with-out-str
or clojure.contrib.sql/with-connection
。后者是当今 Clojure 基础设施的一个相当关键的部分,因此无论它使用什么习惯用法都已经受到了很多人的审查。
要记住的重要问题是,您在某个范围内启动的线程bindings
/ with-bindings
形式做not继承相关变量的反弹值;相反,他们看到的是根绑定。如果您想将绑定传播到工作线程/代理,请显式传递它们(例如作为函数参数)或使用bound-fn
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)