我已经看一看生锈lib目录下:)https://github.com/cyderize/rust-websocket/ 在源文件中https://github.com/cyderize/rust-websocket/blob/master/src/client/response.rs 我见过的方法来开始(:返回性状从功能
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()方法有什么不同? 我应该如何回报价值?
UPD1: @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
^~
是的,我明白你的观点。作家,读者不大。但我并不认同你的观点。在这种情况下如何添加泛型标签应该有所帮助? 另外我试着将这个改变添加到函数中,但仍然有类似的错误。也许我应该以不同的方式建立资源? 最后一条错误消息(以防万一): 错误:特征'核心::标记:: Sized'没有为'websocket :: ws :: sender :: Sender'[E0277] –
slavamnemonic
类型实现。 ..我还没有休息它如何在response.rs案件中工作?以及如何使它在我的情况下工作。 – slavamnemonic
,因为在这种情况下,他们使用'Sender'对象而不是特质。 –