在Clojure中使用redefs和使用redefs fn有什么区别?

在Clojure中使用redefs和使用redefs fn有什么区别?,clojure,mocking,clojurescript,Clojure,Mocking,Clojurescript,我想了解使用redefs的和使用redefs的之间的区别fn 具体的例子对于理解fns行为非常有用。它们基本相同,主要区别在于使用redefs可以显式写出主体(就像在let中),而使用redefs fn需要一个函数作为参数,因此可能需要将所需内容封装在lambda中。另外,使用redefs可以使用向量提供绑定(同样,类似于let),而使用redefs fn需要映射。我认为这两种差异只是表面的 e、 g vs 事实上,使用redefs的是根据使用redefs fn的定义的,基本上只是在使用rede

我想了解使用redefs的
和使用redefs的
之间的区别fn


具体的例子对于理解fns行为非常有用。

它们基本相同,主要区别在于
使用redefs
可以显式写出主体(就像在
let
中),而
使用redefs fn
需要一个函数作为参数,因此可能需要将所需内容封装在lambda中。另外,
使用redefs
可以使用向量提供绑定(同样,类似于
let
),而
使用redefs fn
需要映射。我认为这两种差异只是表面的

e、 g

vs


事实上,使用redefs
是根据使用redefs fn
定义的,基本上只是在使用redefs fn将所有内容传递给
之前将身体包装在一个匿名函数中:

我会忽略使用redefs fn的
,而只使用redefs
,因为它更简单并且具有相同的功能。另外,请注意,表示法
#http/post
要求您为
http/post
使用var,而不是函数本身

有关Clojure
var
如何工作的描述,请参见以下问题:它类似于C指针

在clojure中,当您看到
foo
时,它是一个符号。当您看到
#'foo
时,它是
(var foo)
的快捷方式,这是一种“特殊形式”(即Clojure内置函数,而不是常规函数),它返回
foo
指向的
var
var
依次指向
foo
的值

(with-redefs [http/post (fn [url] {:body "Goodbye world"})]
  (is (= {:body "Goodbye world"} (http/post "http://service.com/greet"))))
(with-redefs-fn {#'http/post (fn [url] {:body "Goodbye world"})}
      (fn [] (is (= {:body "Goodbye world"} (http/post "http://service.com/greet")))))