在Clojure中使用redefs和使用redefs fn有什么区别?
我想了解使用redefs的在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的之间的区别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,而不是函数本身
有关Clojurevar
如何工作的描述,请参见以下问题:它类似于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")))))