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

欢迎!请参阅关于页面以获取更多关于这是如何工作的信息。

0 投票
Clojure

如果这是一个愚蠢的问题,请道歉。我对 Clojure 很是新手。

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

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

如何在另一个命名空间,例如 ns-b,中使用这个 myStringMethod?以下是一个示例代码:

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

我是否需要要求命名空间 ns-a,即使我永远不会使用此命名空间中的任何内容?或者编译器会扫描所有源代码以确保扩展已加载?

谢谢。

1 答案

+1 投票

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

请注意,您不会像调用 Java interop(使用一个点)那样调用协议方法 - 这只会尝试直接在 String 实例上调用方法(且不存在)。您应该像调用其他 Clojure 函数一样调用该函数。

(let [hello "hello"] (myStringMethod hello))
感谢你指出调用 Clojure 协议函数的小技巧。

“在使用协议扩展之前加载代码”你是怎么理解的?

需要扩展定义所在命名空间?或者每个命名空间都应保留扩展代码的一个副本?或者其他方法?
使用 `require`
...