gpt4 book ai didi

Clojure 给出反射警告而不是类型提示

转载 作者:行者123 更新时间:2023-12-04 00:28:37 24 4
gpt4 key购买 nike

我正在编写一个聊天客户端/服务器,并具有以下代码,该代码采用一个套接字,并返回一个可用于更轻松地写入套接字的 clojure.core.async/channel。

我的问题是,尽管有类型提示,但我仍然收到反射警告,即调用 .write无法解决。

(ns chat.main
(:require [clojure.core.async :as a :refer [>! >!! <! <!! go thread chan]])

(:import [java.net Socket ServerSocket]
[java.io InputStream BufferedReader InputStreamReader OutputStream BufferedOutputStream PrintWriter]))

(set! *warn-on-reflection* true)

(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)]
(go
(while (.isConnected sock)
(let [^String message (<! out-chan)]
(.write p-out message) ; <---------- Here
(.flush p-out)))
(a/close! out-chan))
out-chan))

给出:
Reflection warning, C:\Users\slomi\IdeaProjects\chat\src\chat\main.clj:44:5 - call to method write on java.io.PrintWriter can't be resolved (argument types: unknown).

我不知道我怎样才能使它更清楚。两个 p-outmessage被明确暗示。奇怪的是,调用 flush很好。

我该如何解决这个问题?

最佳答案

问题是 go实际上将您的代码重写为状态机(您可以使用 macroexpand-1 来检查转换,但结果很长,所以我没有在此处包含它)。不幸的是,这种转换似乎没有保留类型提示。

也许有更好的解决方案,但如果你将调用拉到它自己的函数中,你可以输入提示,因为它不会被 go 重写:

(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)
write #(.write p-out ^String %)]
(go
(while (.isConnected sock)
(let [message (<! out-chan)]
(write message)
(.flush p-out)))
(a/close! out-chan))
out-chan))

关于Clojure 给出反射警告而不是类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41023669/

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