gpt4 book ai didi

clojure - 为什么 Clojure 无法推断出这个 def 类型?

转载 作者:行者123 更新时间:2023-12-02 12:29:13 26 4
gpt4 key购买 nike

我正在编写客户端/服务器测试,并遇到了一些意外的情况。在以下代码中,无法推断 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 后面。

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

最佳答案

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

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

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

Adding a type-hint ... to specify which overload you expect to use would remove the need for reflection and hopefully calms Cursive down.

就你而言,我会尝试类似的方法:

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

关于clojure - 为什么 Clojure 无法推断出这个 def 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com