如何将EcsClient带有签名的实例impl<P, D> EcsClient<P, D> where P: ProvideAwsCredentials, D: DispatchSignedRequest作为 Rust 中的引用传递给函数?我的尝试是这样的:
extern crate rusoto;
use std::default::Default;
use rusoto::{ DefaultCredentialsProvider, Region };
use rusoto::ecs::{ EcsClient };
use rusoto::default_tls_client;
fn get_task_definition_revisions(client: &EcsClient) {
// Use EscClient instance here
}
fn main() {
let provider = DefaultCredentialsProvider::new().unwrap();
let client = EcsClient::new(default_tls_client().unwrap(), provider, Region::EuWest1).unwrap();
get_task_definition_revisions(&client);
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
extern crate rusoto;
use std::default::Default;
use rusoto::{ DefaultCredentialsProvider, Region };
use rusoto::ecs::{ EcsClient };
use rusoto::default_tls_client;
fn get_task_definition_revisions(client: &EcsClient) {
// Use EscClient instance here
}
fn main() {
let provider = DefaultCredentialsProvider::new().unwrap();
let client = EcsClient::new(default_tls_client().unwrap(), provider, Region::EuWest1).unwrap();
get_task_definition_revisions(&client);
}
Run Code Online (Sandbox Code Playgroud)
我试图解决这个问题是这样的:
extern crate rusoto;
use std::default::Default;
use rusoto::{
DefaultCredentialsProvider,
Region,
ProvideAwsCredentials,
DispatchSignedRequest
};
use rusoto::ecs::{ EcsClient, ListTaskDefinitionsRequest };
use rusoto::default_tls_client;
fn get_task_definition_revisions(client: &EcsClient<ProvideAwsCredentials, DispatchSignedRequest>) {
// Use EcsClient instance here
}
fn main() {
let provider = DefaultCredentialsProvider::new().unwrap();
let client = EcsClient::new(default_tls_client().unwrap(), provider, Region::EuWest1);
get_task_definition_revisions(&client);
}
Run Code Online (Sandbox Code Playgroud)
这给了我:
error[E0243]: wrong number of type arguments: expected 2, found 0
--> src/main.rs:9:43
|
9 | fn get_task_definition_revisions(client: &EcsClient) {
| ^^^^^^^^^ expected 2 type arguments
Run Code Online (Sandbox Code Playgroud)
这感觉就像一个我不应该下去的兔子洞。
我还尝试更改函数签名以接受泛型,但是这EcsClient是一个结构而不是特征。谷歌搜索没有提供太多帮助,因为我不知道要搜索的正确术语。
这个问题似乎暗示我应该能够声明一个像这样的函数fn my_func(client: &EcsClient) { ... }并且它会起作用,那么为什么上面的例子没有呢?
问题在于它EcsClient不是类型,而是构建类型的蓝图(也称为“类型构造函数”)。
因此,您不能仅 EcsClient在需要类型时使用,无论是在函数中还是用于结构成员;相反,每次都必须通过指定其泛型参数来使用它来构建类型。
因此,第一步是引入类型参数:
fn get_task_definition_revisions<P, D>(client: &EcsClient<P, D>) {}
Run Code Online (Sandbox Code Playgroud)
然而,现在编译器会抱怨PandD的约束不足:EcsClient只接受一种非常特定的Pand D!
因此,下一步是查找为P和D在定义中指定的边界EcsClient并应用它们。此时只是复制/粘贴:
fn get_task_definition_revisions<P, D>(client: &EcsClient<P, D>)
where P: ProvideAwsCredentials,
D: DispatchSignedRequest
{
}
Run Code Online (Sandbox Code Playgroud)
然后你是金色的。
如果您需要此特定功能的更多功能P或D为此特定功能提供更多功能,请随时通过使用+以下方法添加更多边界来充分限制它们:
fn get_task_definition_revisions<P, D>(client: &EcsClient<P, D>)
where P: ProvideAwsCredentials + 'static,
D: DispatchSignedRequest
{
}
Run Code Online (Sandbox Code Playgroud)
如果你想知道为什么 Rust 选择让你重复边界P以及D何时它可以完美地推断它们,那是因为它关心你。更具体地说,它在 6 个月后关心你,以及下一个维护者。因此,采取一次编写并阅读多次的立场,它会迫使您复制边界,以便以后您不必怀疑它们是什么,并在用于痛苦地聚合所有部分的每个类型/函数中递归向下钻取. 在 Rust 中,下次您阅读该函数时,您将获得所有信息。
| 归档时间: |
|
| 查看次数: |
4181 次 |
| 最近记录: |