【问题标题】:In EDN, how can I pass multiple values to tagged element returned from other tagged elements在 EDN 中,如何将多个值传递给从其他标记元素返回的标记元素
【发布时间】:2019-11-30 01:24:00
【问题描述】:

我有以下 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)
)

【问题讨论】:

    标签: clojure clojure-java-interop edn


    【解决方案1】:

    你不能完全按照你的要求去做。标签只能处理以下形式。也就是说,您可以更改 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))
    

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

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多