1
A
回答
4
它们基本上是一样的,主要区别是with-redefs
可以让你明确地写出正文(如在let
中),而with-redefs-fn
需要一个函数作为参数,所以你可能需要包装你想要的东西拉姆达。此外,with-redefs
允许您使用矢量提供绑定(再次,如let
),而with-redefs-fn
需要地图。我认为这些差异只是肤浅的。
例如
(with-redefs [http/post (fn [url] {:body "Goodbye world"})]
(is (= {:body "Goodbye world"} (http/post "http://service.com/greet"))))
VS
(with-redefs-fn {#'http/post (fn [url] {:body "Goodbye world"})}
(fn [] (is (= {:body "Goodbye world"} (http/post "http://service.com/greet")))))
事实上,with-redefs
中的with-redefs-fn
来定义,基本上只是包装身在一个匿名函数传递一切with-redefs-fn
前:https://github.com/clojure/clojure/blob/e3c4d2e8c7538cfda40accd5c410a584495cb357/src/clj/clojure/core.clj#L7404
2
我会忽略with-redefs-fn
并且只使用with-redefs
,因为它更简单并且具有相同的能力。另外,请注意,符号#'http/post
要求您使用var代替http/post
,而不是函数本身。
有关Clojure var
如何工作的说明,请参阅此问题:When to use a Var instead of a function?它类似于C指针。
在clojure中,当您看到foo
时,它是一个符号。当您看到#'foo
时,它是(var foo)
的一种快捷方式,它是一种“特殊形式”(即Clojure内置函数,不是常规函数),它返回var
foo
指向的点。 var
又指示foo
的值。
相关问题
- 1. 有什么区别`和$(Bash中有什么区别?
- 2. Lisp/Clojure中的procedure和#程序有什么区别?
- 3. 在Lisp(Clojure,Emacs Lisp)中,list和quote有什么区别?
- 4. ==和===有什么区别?
- 5. ==和===有什么区别?
- 6. 有什么区别? :和||
- 7. ==和===有什么区别?
- 8. '=='和'==='有什么区别?
- 9. `&`和`ref`有什么区别?
- 10. 有什么区别:。!和:r!?
- 11. | 0和~~有什么区别?
- 12. Appender和〜有什么区别?
- 13. xtype和别名有什么区别?
- 14. XSD中IDREF和IDREFS有什么区别?
- 15. COM中IDispatch和IUnkown有什么区别?
- 16. 在JavaScript中,'\'和'\ n'有什么区别?
- 17. =和在mysql中有什么区别?
- 18. Lisp中'和#'有什么区别?
- 19. python中的{}和[]有什么区别?
- 20. 在Ember.js中,[]和Ember.A([])有什么区别?
- 21. VB6中Sub和Function有什么区别?
- 22. 列表中的:::和++有什么区别?
- 23. C++中#import和#include有什么区别?
- 24. printf中%c和%C有什么区别?
- 25. wordpress中is_page()和is_paged()有什么区别?
- 26. Java中boolean和Boolean有什么区别?
- 27. SQL中的“LIKE”和“=”有什么区别?
- 28. vim中de和dw有什么区别?
- 29. Visual Studio中//和///有什么区别?
- 30. Java中> =和=>有什么区别?