2015-06-27 73 views
4

我已经看一看生锈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 
        ^~ 

回答

3

由于任何类型都可能暗示特质,因此只有了解它所实现的特性,才能知道对象的大小。你可以做的是让你的函数通用于分别实现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 
} 

之所以增加仿制药的作品,是因为通用标签指向实际类型,在不知道类型的任何东西,除了其性状它们实现。

+1

是的,我明白你的观点。作家,读者不大。但我并不认同你的观点。在这种情况下如何添加泛型标签应该有所帮助? 另外我试着将这个改变添加到函数中,但仍然有类似的错误。也许我应该以不同的方式建立资源? 最后一条错误消息(以防万一): 错误:特征'核心::标记:: Sized'没有为'websocket :: ws :: sender :: Sender '[E0277] – slavamnemonic

+0

类型实现。 ..我还没有休息它如何在response.rs案件中工作?以及如何使它在我的情况下工作。 – slavamnemonic

+0

,因为在这种情况下,他们使用'Sender'对象而不是特质。 –

1

要替换WriteSend与具体类型的返回类型。

尝试改变线let mut ws = response.begin();let mut ws:() = response.begin(),你会看到一个错误信息会告诉你什么正在从开始函数返回的具体类型。

+0

我按照你的建议做了测试。其实我从这一步开始。任何方式。如果ws:()= ... 我收到错误:'found struct websocket :: client :: Client')[E0308]' 因此下一步是将此结构设置为返回类型。 fn get_transport(url: &str) -> websocket::client::Client { 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:36:51:36:76错误:错误的数字类型参数:期望3,找到0 [E0243] – slavamnemonic