2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参见 关于 页面以了解更多关于如何使用本网站的信息。

0
Clojure

如果这是一个很 naive 的问题,请见谅。我是 Clojure 的新手。

我有一个关于跨命名空间的协议扩展的问题。

假设我有一个命名空间 ns-a,在其中使用协议扩展 Java 的 String 类型,添加一个名为 myStringMethod 的方法。

我如何在另一个命名空间,例如 ns-b 中使用这个 myStringMethod,以下面的代码为例?

(let [hello "hello"] (. hello myStringMethod)) 

我是否需要引入 ns-a 命名空间,尽管我永远不会使用来自 ns-a 的任何内容?还是编译器会扫描所有代码以确保扩展已加载?

谢谢。

1 回答

+1

在使用协议扩展的任何代码之前,您需要加载它。

请注意,您不会通过 Java 互操作(使用.)来调用协议方法 - 这将只会尝试直接在 String 实例上调用方法(而它不存在)。您应该像调用任何其他 Clojure 函数一样调用该函数。

(let [hello "hello"] (myStringMethod hello))
感谢您关于调用 clojure 协议函数的建议。

什么是“在使用之前加载代码”对协议扩展的意思?

需要定义扩展的命名空间?或者每个命名空间应该有一个扩展代码的副本?还是其他方式?
by
使用 `require`
...