3

我正在编写客户端/服务器测试,但遇到了一些意想不到的事情。在以下代码中,Socket无法推断构造函数的端口参数:

(ns second-try.test.client
  (:import [java.net Socket]))

(def port 5555)

(defn -main []
  ; "Cannot disambiguate overloads of Socket"
  (let [sock (Socket. "127.0.0.1" port)]))

第一个参数的类型应该很明显,因为我传递的是文字。我认为端口的类型也很明显,因为它只是文字;尽管有一个隐藏在def.

但由于某种原因,它无法确定port. def我可以通过在, 或参数前面添加注释来解决它,但为什么这是必要的?类型是什么不应该很明显吗?

4

2 回答 2

3

在 Clojure 中,实际上不可能推断存储在 var 中的值的类型,因为 var 可以随时重新定义。

但是,Clojure 在运行时确定类型应该没有任何问题,虽然它需要在运行时使用反射来消除歧义,但相关代码应该(并且确实)运行。

该错误似乎与草书有关: https ://stackoverflow.com/a/32473508/440294

添加一个 type-hint ... 来指定您希望使用的重载将消除反射的需要,并有望使 Cursive 平静下来。

在你的情况下,我会尝试类似:

(defn -main []
  ; "Cannot disambiguate overloads of Socket"
  (let [^int p port
        sock (Socket. "127.0.0.1" p)]))
于 2017-01-15T02:09:10.993 回答
2

在这种情况下,只需将您的 var 声明为:const

(def ^:const port 5555)

(defn -main []
  (let [sock (Socket. "127.0.0.1"  port)]))
于 2017-01-15T08:33:05.497 回答