[英]Return Traits from function
我看一下生銹lib: 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()方法有什么區別? 在我的情況下,我應該如何回報價值?
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
^~
由於任何類型都可能影響特征,因此您無法通過了解對象實現的特征來了解對象的大小。 你可以做的是,使你的函數分別通用於實現Write和Read的類型。 這樣您就可以返回對象,而不知道對象的實際類型是什么。
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
}
添加泛型的原因之一是因為泛型標簽指向實際類型,而不知道除了它們實現的特征之外的任何類型。
您希望使用具體類型替換返回類型中的Write
和Send
。
嘗試更改行let mut ws = response.begin();
let mut ws: () = response.begin()
,您將看到一條錯誤消息,告訴您從begin函數返回的具體類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.