Generics 使用泛型特征的多个实现向编译器通知特定类型的简明方法是什么?

Generics 使用泛型特征的多个实现向编译器通知特定类型的简明方法是什么?,generics,types,casting,rust,traits,Generics,Types,Casting,Rust,Traits,我遇到了一个奇怪的类型推断问题,这让我有些挠头 我正在为多种类型的结构实现一个泛型特征。我从&str开始: struct Bar<'a> { baz: &'a str, } trait Foo<T> { fn foo(&self) -> T; } impl<'a> Foo<&'a str> for Bar<'a> { fn foo(&self) -> &'a

我遇到了一个奇怪的类型推断问题,这让我有些挠头

我正在为多种类型的结构实现一个泛型特征。我从
&str
开始:

struct Bar<'a> {
    baz: &'a str,
}

trait Foo<T> {
    fn foo(&self) -> T;
}

impl<'a> Foo<&'a str> for Bar<'a> {
    fn foo(&self) -> &'a str {
        self.baz
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_str_a() {
        let bar = Bar { baz: "asd" };
        assert_eq!("asd", bar.foo());
    }
}
在本例中,我得到以下错误:


错误[E0283]:需要类型注释:无法解析'Bar使用turbofish将类型参数传递给trait(
):

assert\u eq!(“asd”,Foo:::Foo(&bar));
您还可以使用来消除该方法所属特征的歧义:

// This is "type-qualified" and equivalent to `Foo::<&str>::foo(&bar)`
assert_eq!("asd", <_ as Foo<&str>>::foo(&bar));

// This is "fully qualified"
assert_eq!("asd", <Bar as Foo<&str>>::foo(&bar));
//这是“type-qualified”,相当于'Foo:::Foo(&bar)`
断言!(“asd”,::foo(&bar));
//这是“完全合格的”
断言!(“asd”,::foo(&bar));

@Shepmaster,这不是类型不明确的情况。这是不明确的
Trait
,因此不需要完全限定语法
Trait::method()
::method()
的缩写形式。我不确定我是否在跟踪你。。。UFCS名称不正确,已重命名为FQS。您最初的回答指出OP应该使用UFCS(因此是FQS),但现在您的注释说明OP不应该使用FQS。您的第一条注释说明
Trait::method()
语法既不是FQS也不是UFCS。我认为“FQS是
::method()
语法的一个特定名称,而
Trait::method()
语法有其他名称”,并相应地回答了这个问题。事实上
Trait::method()
(或
Trait::::method()
)和
::method()
(或
::method()
)都是FQS。正如书中所说:“但是,我们可以省略Rust能够从程序中的其他信息中找出的语法的任何部分。”我声称
Trait::method()
不是FQS,我相信只有带尖括号的表单才是FQS(
::method
/
::method
/
)。答案中的代码只是使用turbofish来填充类型参数。同样,
iterator.collect::
也没有使用FQS。
let foo: &str = bar.foo();
assert_eq!("asd", Foo::<&str>::foo(&bar));
// This is "type-qualified" and equivalent to `Foo::<&str>::foo(&bar)`
assert_eq!("asd", <_ as Foo<&str>>::foo(&bar));

// This is "fully qualified"
assert_eq!("asd", <Bar as Foo<&str>>::foo(&bar));