我正在编写客户端/服务器测试,并遇到了意想不到的事情。在以下代码中,Socket
构造函数的port参数无法推断:
(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
上或在参数前面添加注释来解决它,但为什么这是必要的?不应该明白它的类型是什么?
答案 0 :(得分:3)
在Clojure中推断存储在var中的值的类型是不可能的,因为var可以随时重新定义。
但是,Clojure在运行时确定类型不应该有任何问题,虽然它需要使用反射来在运行时消除歧义,但是有问题的代码应该(并且确实)运行。
该错误似乎与草书有关:https://stackoverflow.com/a/32473508/440294
添加一个类型提示...以指定您希望使用哪个重载将消除对反射的需要,并希望平息Cursive。
在你的情况下,我会尝试类似的事情:
attr()
答案 1 :(得分:2)
在这种情况下,只需将var声明为:const
:
(def ^:const port 5555)
(defn -main []
(let [sock (Socket. "127.0.0.1" port)]))