gpt4 book ai didi

Clojure:覆盖库中的一个函数

转载 作者:行者123 更新时间:2023-12-02 16:11:25 25 4
gpt4 key购买 nike

这个问题是在 previous question I asked 的后面几天前在这里。其中一条评论是我应该放弃用于提取查询参数的 Ring 中间件并编写我自己的中间件。我认为我会尝试的一种替代方案是利用现有的替代方案来获得我想要的东西,并且我一直在深入研究 Ring 源代码。它几乎完全符合我的要求。如果我写出我理解它是如何工作的:

  1. 中间件具有函数 wrap-params调用参数请求
  2. params-requestparams 映射添加到 request 映射,调用 assoc-query-params
  3. assoc-query-params最终在传入的查询字符串上调用 ring.util.codec/form-decode 以将其转换为映射
  4. form-decode使用 assoc-conj 通过 reduce 将值合并到现有映射中
  5. assoc-conj的文档字符串说

Associate a key with a value in a map. If the key already exists inthe map, a vector of values is associated with the key.

最后一个函数是我上一个问题中有问题的函数(TL;DR:我希望 map 的值在字符串或向量类中保持一致)。戴上面向对象的帽子,我可以通过子类化和覆盖我需要改变行为的方法轻松解决这个问题。但是,对于 Clojure,我看不出如何只替换一个函数而不必更改堆栈中的所有内容。这可能并且容易吗,或者我应该以另一种方式进行吗?如果涉及到它,我可以复制整个中间件库和编解码器库,但对我来说它似乎有点重量级。

最佳答案

虽然自定义中间件可能是解决此问题的最明确方法,但不要忘记您始终可以使用 with-redefs 覆盖任何 函数.例如:

(ns tst.demo.core
(:use tupelo.core tupelo.test))

(dotest
(with-redefs [clojure.core/range (constantly "Bogus!")]
(is= "Bogus!" (range 9))))

虽然这主要在单元测试期间使用,但它是一个敞开的逃生舱口,可用于覆盖任何功能。

对于 Clojure,源代码中的 Var 与库中的 Var(甚至 clojure.core 本身,如示例所示)之间没有区别。

关于Clojure:覆盖库中的一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67899108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com