首页 > 解决方案 > 在 EDN 中,如何将多个值传递给从其他标记元素返回的标记元素

问题描述

我有以下 EDN

{
    :test #xyz/getXyz #abc/getAbc #fgh/getFgh "sampleString"
}

在 Clojure 中,我为每个内部调用 java 函数的标记元素定义了实现。我有一个要求,我需要将 #abc/getAbc 和 #fgh/getFgh 的返回值作为单独的参数传递给 #xyz/getXyz。在我当前的实现中,#fgh/getFgh 使用“sampleString”调用。随着#fgh/getFgh 的输出,#abc/getAbc 被调用。并通过其输出 #xyz/getXyz 被调用。我的要求是#xyz/getXyz 应该以#abc/getAbc 和#fgh/getFgh 的返回值作为单独的参数来调用。

Clojure 实现

(defn getXyz [sampleString]
    (.getXyz xyzBuilder sampleString)
)

(defn getAbc [sampleString]
    (.getAbc abcBuilder sampleString)
)

(defn getFgh [sampleString]
    (.getFgh fghBuilder sampleString)
)

(defn custom-readers []
    {
        'xyz/getXyz getXyz
        'xyz/getAbc getAbc
        'xyz/getFgh getFgh
    }
)

我想将 getXyz 修改为

(defn getXyz [abcReturnValue fghReturnValue]
    (.getXyz xyzBuilder abcReturnValue fghReturnValue)
)

标签: clojureclojure-java-interopedn

解决方案


你不能完全按照你的要求去做。标签只能处理以下形式。也就是说,您可以更改 Xyz EDN 的语法,以便它可以支持采用一[Abc Fgh]对向量。

{:test #xyz/getXyz [#abc/getAbc "sampleString" #fgh/getFgh "sampleString"]}

我不确定您是否意味着 getAbc 仍然需要将 getFgh 作为输入。如果是这样,它会更像:

{:test #xyz/getXyz [#abc/getAbc #fgh/getFgh "sampleString" #fgh/getFgh "sampleString"]}

现在您的 getXyz 标记阅读器将收到 Abc 和 Fgh 的向量。因此,您需要更改代码以从向量内部获取元素,如下所示:

(defn getXyz [[abcReturnValue fghReturnValue]]
  (.getXyz xyzBuilder abcReturnValue fghReturnValue))

这使用解构语法(请注意,参数被包裹在一对额外的括号中),但如果您愿意,您可以使用firstandsecond或任何其他方式。


推荐阅读