- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道下面的代码片段中发生了什么。为什么没有在不强制评估序列的情况下正确地重新定义函数?
user> (defn foo [] (map vector (range 3)))
#'user/foo
user> (defn bar [] (map #(vector %) (range 3)))
#'user/bar
user> (foo)
([0] [1] [2])
user> (bar)
([0] [1] [2])
user> (with-redefs [vector (fn [_] "what does the fox say?")] (foo))
("what does the fox say?" "what does the fox say?" "what does the fox say?")
user> (with-redefs [vector (fn [_] "what does the fox say?")] (bar))
([0] [1] [2])
user> (with-redefs [vector (fn [_] "what does the fox say?")] (vec (bar)))
["what does the fox say?" "what does the fox say?" "what does the fox say?"]
user>
谢谢!
最佳答案
不同的是,当你调用foo
时, vector
,作为 map
的参数, 被评估一次(在本例中意味着将其解析为函数对象),不需要再次解析。即使您的代码退出后,也会使用相同的函数对象 with-redefs
.
在 bar
,然而,它不是 vector
这是 map
的一个论点,而是引用 vector
的匿名函数按名字。结果是,虽然匿名函数仅计算一次,vector
每次调用匿名函数时都会得到解析。因为map
是懒惰的,这是在代码已经退出之后发生的 with-redefs
(你的力量评估时除外)。
关键点是在函数调用中 - 如 (map vector (range 3))
- 每个参数都会被评估,并且调用函数会获取这些评估的结果。这意味着map
调用foo
获取重新定义的vector
,而map
调用bar
获取一个仍需要查找的函数 vector
调用时按名称。
Clojure.org page on evaluation提供有关如何将符号解析为对象的一些详细信息。这也是 late binding 的示例.
关于clojure - 映射内使用的函数的 with-redefs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341516/
我想了解 with-redefs 和 with-redefs-fn 之间的区别。 具体的例子对于理解 fns 的行为很有帮助。 最佳答案 它们基本相同,主要区别在于 with-redefs允许您显式写
我执行了以下代码(摘自真实用例),并期望得到“Fake 2 a b”: (defn real-func ([a] (real-func a "S")) ([a b] (real-func a
我想知道下面的代码片段中发生了什么。为什么没有在不强制评估序列的情况下正确地重新定义函数? user> (defn foo [] (map vector (range 3))) #'user/foo
我希望能够模拟 MyFunction 但是我需要模拟在 MyFunction 被调用时返回不同的值。 是否可以使用with-redefs根据函数的调用顺序返回不同的值? (testing "POST
我想对代码的异常处理部分进行单元测试。为此,我使用 with-redefs 重新绑定(bind)可以抛出异常的 API,以便在测试期间抛出异常。我的测试函数看起来像这样 (deftest except
clojure.core 有宏 bindings和 with-redefs 。查看 clojuredocs.org 上的文档字符串和示例,它们似乎做了非常相似的事情。有什么区别以及在什么情况下应该使用
在我看来,with-redefs可以做绑定(bind)到动态符号可以做的所有事情,只是它没有需要的限制>^:动态元数据。那么我什么时候应该使用其中一种而不是另一种呢? 最佳答案 除了需要 ^:dyna
我有一些代码,我重构后才发现 loop 有问题。经过一些调试后,我发现 loop 和 with-redefs 不能很好地协同工作。我意识到在循环中使用 with-redefs 可能没有意义,但我没想到
我希望使用 with-redefs模拟来自 STDIN 的用户输入。 首先,我正在测试不正确的输入,它应该重新询问用户输入。然后,应该给出正确的输入。 有没有办法使用with-redefs将连续不同的
我很难在 Clojure 中使用 with-redefs 在 Windows 上进行模拟来创建简单的单元测试。测试代码、我要测试的函数和要模拟的函数都在不同的命名空间/文件中: 待测函数: (ns c
我有一个关于 with-redefs 的问题。以下示例未按预期工作。在 findmax 中,总是调用 clojure.core/max 而不是with-redefs 语句。 (defn findmax
我正在测试一个函数,以确保它调用另一个命名空间中的函数。我想将函数 stub (使用 speclj stub ),以便我可以记录调用。 (defn fn-under-test [] (p/help
当我尝试将 weblogic.xml 中启用 fast-swap 模式的分解目录部署到 weblogic 10.3 时,出现以下异常 如果我删除
我是一名优秀的程序员,十分优秀!