0

我想hyper::Client根据 URL 方案进行配置。为此,我创建了一个小方法:

extern crate http; // 0.1.8
extern crate hyper; // 0.12.7
extern crate hyper_tls; // 0.1.4

use http::uri::Scheme;
use hyper::{Body, Client, Uri};
use hyper_tls::HttpsConnector;

#[derive(Clone, Debug)]
pub struct Feed;

impl Feed {
    fn get_client(uri: Uri) -> Client {
        match uri.scheme_part() {
            Some(Scheme::HTTP) => Client::new(),
            Some(Scheme::HTTPS) => {
                let https = HttpsConnector::new(4).expect("TLS initialization failed");
                let client = Client::builder().build::<_, Body>(https);
            }
            _ => panic!("We don't support schemes other than HTTP/HTTPS"),
        }
    }
}

当我尝试编译它时,我收到以下错误消息:

error[E0243]: wrong number of type arguments: expected at least 1, found 0
  --> src/main.rs:13:32
   |
13 |     fn get_client(uri: Uri) -> Client {
   |                                ^^^^^^ expected at least 1 type argument

我不明白为什么它不能编译

  • 我已经在 main.rs 中声明了我对超级板条箱的使用
  • 我在文件头中声明我的用途

我究竟做错了什么 ?

4

2 回答 2

2

查看文档Client:Client是一个泛型类型,它依赖于两个类型参数:一个连接器类型C和一个可选的主体类型B。您需要指定适用于Client您返回的类型参数,除了在您的特定情况下,您希望根据 URI 方案返回 aClient<HttpConnector>或 a 。Client<HttpsConnector>你不能那样做,期间。

根据您打算如何使用您的get_client函数,您可以将返回值包装在enum

enum MyClient {
    HttpClient (Client<HttpConnector>),
    HttpsClient (Client<HttpsConnector>),
}
impl MyClient {
    pub fn get(&self, uri: Uri) -> ResponseFuture {
        match self {
            HttpClient (c) => c.get (uri),
            HttpsClient (c) => c.get (uri),
        }
    }
}

fn get_client(uri: Uri) -> MyClient { /* … */ }

或者您可以定义一个特征,为它实现它并Client<HttpConnector>返回您的特征的盒装实例,例如:Client<HttpsConnector>get_client

trait MyClient {
    pub fn get(&self, uri: Uri) -> ResponseFuture;
}
impl<C> MyClient for Client<C> {
    pub fn get(&self, uri: Uri) -> ResponseFuture {
        Client<C>::get (&self, uri)
    }
}

fn get_client(uri: Uri) -> Box<MyClient> { /* … */ }
于 2018-08-14T13:19:25.583 回答
2

hyper::Client接受类型参数。您可以在关联的函数调用中省略它们,Client::new()因为编译器会推断它们,但它不会在函数签名中这样做。

您希望返回类型为Client<HttpConnector, Body>.

问题在于您的构建器方法返回 a Client<HttpsConnector, Body>,这是不同的。您可能必须定义自己的特征以对连接器进行抽象。

于 2018-08-14T12:55:31.090 回答