请分享您的想法,参与Clojure 2024 状况调查!

欢迎!请访问关于页面了解更多关于此功能的信息。

0
Clojure

如果这是一个无知的问题,请见谅。我对 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协议函数的建议。

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

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