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. 有什麼區別:while和:在clojure時?
- 2. Clojure:[D和[Ljava.lang.Double;有什麼區別?
- 3. 有什麼區別`和$(Bash中有什麼區別?
- 4. 在Clojure(core.async)中,alt和alt有什麼區別?
- 5. Clojure中的macroexpand和macroexpand-1有什麼區別
- 6. Lisp/Clojure中的procedure和#程序有什麼區別?
- 7. 在Lisp(Clojure,Emacs Lisp)中,list和quote有什麼區別?
- 8. Clojure,Scheme/Racket和Common Lisp之間有什麼區別?
- 9. 有什麼區別? :和||
- 10. &&和||有什麼區別?
- 11. 「/」和「/ *」有什麼區別?
- 12. 有什麼區別:。!和:r!?
- 13. ==和===有什麼區別?
- 14. Appender和〜有什麼區別?
- 15. $ @和$ *有什麼區別?
- 16. is和=有什麼區別?
- 17. #.00和#。##有什麼區別?
- 18. `==`和`is`有什麼區別?
- 19. '=='和'==='有什麼區別?
- 20. /和/#/有什麼區別?
- 21. | 0和~~有什麼區別?
- 22. `&`和`ref`有什麼區別?
- 23. ==和===有什麼區別?
- 24. ==和===有什麼區別?
- 25. `{}`和`[]`有什麼區別?
- 26. JavaScript和=== ===有什麼區別?
- 27. difftime和' - '有什麼區別?
- 28. =和==有什麼區別?
- 29. Clojure中[]和'[]之間的區別是什麼
- 30. xtype和別名有什麼區別?