【问题标题】:How to write a public field of a Java object in Clojure?如何在 Clojure 中编写 Java 对象的公共字段?
【发布时间】:2018-09-14 16:14:45
【问题描述】:

This question 回答如何从 Java 对象中读取公共字段:

(let [p (java.awt.Point.)]
  (.x p))  ; <- returns 0

我想我可以用类似的方式编写该字段:

(let [p (java.awt.Point.)]
  (.x p 42))

但我收到以下错误:

IllegalArgumentException No matching method found: x for class java.awt.Point
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)

【问题讨论】:

    标签: clojure clojure-java-interop


    【解决方案1】:

    这在Clojure - Java Interop:

    (set! (. instance-expr instanceFieldName-symbol) expr)
    

    赋值特殊形式。

    当第一个操作数是字段成员访问表单时,赋值给相应的字段。如果是实例字段,则实例 expr 将被求值[并分配给相应的实例字段]。

    还要注意在解析字段时使用“-”:

    如果 [(. instance-expr member)] 的第二个操作数是以 - 开头的符号,则成员符号将仅解析为字段访问(从不作为 0-arity 方法)和 应该是首选 当这是意图时......”

    因此:

    (set! (. p -x) 42)
    

    另外,“访问字段或方法成员的首选惯用形式”略有不同,这种等效性显示在页面顶部的宏扩展中。

    (set! (.-x p) 42)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2010-09-19
      • 2011-07-17
      • 2016-07-19
      • 2016-05-08
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多