clojure - 定义记录中的名称冲突?

时间:2011-07-18 00:51:33

标签: clojure java-interop clojure-java-interop

我有一段行为不端的代码;当我将记录命名为 MethodInfo 时,它不再正确覆盖 .toString 方法。

(defrecord MethodInfo [^clojure.lang.ISeq x ^clojure.lang.ISeq y]
  java.lang.Object
    (toString [x]
      (str (:x x))))

运行简单的测试会显示失败的原因,

=> (.toString (new MethodInfo [1 2] [3]))
"sketch.compiler.main.sklojure1.MethodInfo@10e0d118"

而将记录重命名为 A 会显示代码行为正确,

=> (.toString (new A [1 2] [3]))
"[1 2]"

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的记录对我来说很好。我建议重新启动REPL,因为可能会有一些旧代码。另请注意,您可以直接访问记录中的字段,因此您可以编写

(defrecord MethodInfo [x y]
  Object
  (toString [_] (str x)))

而不是

(defrecord MethodInfo [x y]
  Object
  (toString [this] (str (:x this))))