Generics 在不指定具体关联类型的情况下别名特征边界

Generics 在不指定具体关联类型的情况下别名特征边界,generics,rust,associated-types,Generics,Rust,Associated Types,我发现自己在相同的边界下用参数编写不同的函数,如下所示: pub fn foo<T>(mut self, path: T) -> Self where T: IntoIterator, T::Item: AsRef<str>, { // ... } pub fn bar<T>(mut self, path: T) -> Self where T: IntoIterator, T::Item: AsRef&l

我发现自己在相同的边界下用参数编写不同的函数,如下所示:

pub fn foo<T>(mut self, path: T) -> Self where
    T: IntoIterator,
    T::Item: AsRef<str>,
{
    // ...
}

pub fn bar<T>(mut self, path: T) -> Self where
    T: IntoIterator,
    T::Item: AsRef<str>,
{
    // ...
}
pub-fn-foo(mut-self,路径:T)->self-where
T:迭代器,
T::项目:AsRef,
{
// ...
}
pub fn bar(mut self,路径:T)->self where
T:迭代器,
T::项目:AsRef,
{
// ...
}
感觉这有点烦人,我试着给这些界限加上别名。但是我没有找到一个方法来解决这个问题。在检查了几个地方[1]、[2]之后,我得到的最接近的结果是:

trait Path {
    type I: IntoIterator<Item = Self::S>;
    type S: AsRef<str>;
}

impl<T, U> Path for T where
    T: IntoIterator<Item = U>,
    U: AsRef<str>,
{
    type I = T;
    type S = U;
}
trait路径{
I型:输入迭代器;
类型S:AsRef;
}
T的impl路径,其中
T:迭代器,
U:AsRef,
{
I型=T;
S型=U型;
}
现在,作为一个例子,这可以很好地编译:

fn into_vec<T: Path>(it: T::I) -> Vec<String> {
    it.into_iter()
        .map::<String, _>(|x| x.as_ref().into())
        .collect()
}
fn-into\u-vec(it:T::I)->vec{
it.into_iter()
.map::(|x | x.as_ref().into())
.collect()
}
但当我尝试使用它时:

fn consume<T: Path>() {
    into_vec::<T>(&["one", "two"]);
}
fn消费(){
分为:(&[“一”,“二]);
}
我得到以下错误:

src/lib.rs:104:19: 104:34 error: mismatched types:
 expected `<T as Path>::I`,
    found `&[&str; 2]`
(expected associated type,
    found &-ptr) [E0308]
src/lib.rs:104     into_vec::<T>(&["one", "two"]);
                                 ^~~~~~~~~~~~~~~
src/lib.rs:104:19:104:34错误:不匹配的类型:
应为“”::I`,
找到`&[&str;2]`
(预期关联类型,
找到和-ptr)[E0308]
src/lib.rs:104到_vec:(&[“一”,“二]);
^~~~~~~~~~~~~~~
所以,运气不好。我怎样才能前进


1
二,

我怎样才能前进

你不能直接。让我们看看您的函数:

fn consume<T: Path>() {
    into_vec::<T>(&["one", "two"]);
}

澄清一下,这与将特征组合成另一个特征无关。这对于任何特征都是一个问题。

您能展示使用单独特征实现的
消费吗?如果有一个泛型类型的方法没有在参数或结果值中使用,这是非常可疑的。比如,我认为这是不可能的。你是说在这个游戏笔()中有什么类似于noalias_消费的东西吗?事实上,它不起作用。
fn consume() {
    into_vec::<&[&'static str]>(&["one", "two"]);
}