我已经查看了rust库:https://github.com/cyderize/rust-websocket/
在源文件https://github.com/cyderize/rust-websocket/blob/master/src/client/response.rs中,我看到了begin()方法:
但是不幸的是,我得到了错误的结果:
但在下一次编译中,出现了以下错误:
在这种情况下,我会收到错误信息:
pub fn begin(self) -> Client<DataFrame, Sender<W>, Receiver<R>> {
let (reader, writer) = self.into_inner();
let sender = Sender::new(writer);
let receiver = Receiver::new(reader);
Client::new(sender, receiver)
}
所以...我决定创建一些简单的封装函数:
fn get_transport(url: &str) -> Client<DataFrame, Sender<Write>, Receiver<Read>> {
let url = Url::parse(url).unwrap();
let request = Client::connect(url).unwrap();
let response = request.send().unwrap();
let mut ws = response.begin();
ws
}
但是不幸的是,我得到了错误的结果:
error: the trait `core::marker::Sized` is not implemented for the type `websocket::ws::sender::Sender<std::io::Write>` [E0277]
src/lib.rs:36 fn get_transport(url: &str) -> Client<DataFrame, Sender<Write>, Receiver<Read>> {
请问有人能告诉我为什么我不能用这种方式返回值。与response.rs
中的begin()方法有何区别?
在我的情况下应该如何返回值?
更新1: 在@ker的建议下,我有了下面的代码:
fn get_transport<W: Write, R: Read, S: Sender<W>, RE: Receiver<R>>(url: &str) -> Client<DataFrame, S, RE> {
let url = Url::parse(url).unwrap();
let request = Client::connect(url).unwrap();
let response = request.send().unwrap();
let mut ws = response.begin();
ws
}
但在下一次编译中,出现了以下错误:
src/lib.rs:45:5: 45:7 error: mismatched types:
expected `websocket::client::Client<websocket::dataframe::DataFrame, S, RE>`,
found `websocket::client::Client<websocket::dataframe::DataFrame, websocket::client::sender::Sender<websocket::stream::WebSocketStream>, websocket::client::receiver::Receiver<websocket::stream::WebSocketStream>>`
(expected type parameter,
found struct `websocket::client::sender::Sender`) [E0308]
src/lib.rs:45 ws
^~
src/lib.rs:45:5: 45:7 help: run `rustc --explain E0308` to see a detailed explanation
error: aborting due to previous error
看起来我使用了错误的发送者和接收者:\ 在对部分进行更正后,我获得了结果代码:
fn get_transport(url: &str) -> Client<DataFrame, Sender<WebSocketStream>, Receiver<WebSocketStream>> {
let url = Url::parse(url).unwrap();
let request = Client::connect(url).unwrap();
let response = request.send().unwrap();
let mut ws = response.begin();
ws
}
很抱歉,我无法找出为什么无法将泛型用作结果值。就像这样:
fn get_transport<R: Read, W: Write>(url: &str) -> Client<DataFrame, Sender<W>, Receiver<R>>
在这种情况下,我会收到错误信息:
expected `websocket::client::Client<websocket::dataframe::DataFrame, websocket::client::sender::Sender<W>, websocket::client::receiver::Receiver<R>>`,
found `websocket::client::Client<websocket::dataframe::DataFrame, websocket::client::sender::Sender<websocket::stream::WebSocketStream>, websocket::client::receiver::Receiver<websocket::stream::WebSocketStream>>`
(expected type parameter,
found enum `websocket::stream::WebSocketStream`) [E0308]
src/lib.rs:45 ws
^~
websocket::ws::sender::Sender<W>
,未实现特性core::marker::Sized
[E0277] - slavamnemonicW
和R
泛型的类型。这被称为特化,很可能不是您想要的。您可以简单地删除泛型并返回实际类型websocket::client::Client<websocket::dataframe::DataFrame, websocket::client::sender::Sender<websocket::stream::WebSocketStream>, websocket::client::receiver::Receiver<websocket::stream::WebSocketStream>>
,这正是错误消息告诉您的。 - oli_obk