Rust 具有Into<;的多个泛型;PathBuf>;

Rust 具有Into<;的多个泛型;PathBuf>;,rust,Rust,我正在为我的游戏引擎开发一个资产管理器 以下是代码的简化版本: trait Animal { fn create<P>(name: P) -> Self where P: Into<PathBuf>; } struct Dog; impl Animal for Dog { fn create<P>(name: P) -> Self where P: Into<PathBuf&

我正在为我的游戏引擎开发一个资产管理器

以下是代码的简化版本:

trait Animal {
    fn create<P>(name: P) -> Self
    where
        P: Into<PathBuf>;
}

struct Dog;

impl Animal for Dog {
    fn create<P>(name: P) -> Self
    where
        P: Into<PathBuf>
    {
        Self {}
    }
}

fn create_animal<A, P>(name: P) -> A
where
    P: Into<PathBuf>,
    A: Animal,
{
    A::create(name)
}

现在调用此函数的唯一方法是显式传递这两种类型:

let dog = create_animal::<Dog, &str>("Spike"); // This code is correct
let dog=create_animal::(“Spike”);//这个代码是正确的

我想知道是否有任何方法可以在不显式传递其类型(如第一个示例中)的情况下将Into与任何其他trait绑定一起使用。

您可以使用
\u
保留第二个未指定的类型:

let dog = create_animal::<Dog, _>("Spike");

您可以使用
\u
将第二种类型保留为未指定:

let dog = create_animal::<Dog, _>("Spike");

出于好奇,您是否需要
create\u animal
factory功能?有没有多余的东西是你忽略掉的?是否需要将
P
作为类型参数?为什么不使用
&str
作为
name
的类型?@Dai,在一般情况下,路径作为
P:AsRef
传递。OP没有做到这一点,但尝试了与
P:Into
类似的方法,但是一般来说,添加类型参数可以使其更通用。比如,如果我已经在使用
PathBuf
建立指向某个对象的路径并在目录上迭代,我肯定不想用它创建
&str
。@BrendanWilson,它实际上是
AssetManager
结构的一种方法。所以它里面有一些额外的东西,比如缓存和验证。出于好奇,你需要
create\u animal
工厂功能吗?有没有多余的东西是你忽略掉的?是否需要将
P
作为类型参数?为什么不使用
&str
作为
name
的类型?@Dai,在一般情况下,路径作为
P:AsRef
传递。OP没有做到这一点,但尝试了与
P:Into
类似的方法,但是一般来说,添加类型参数可以使其更通用。比如,如果我已经在使用
PathBuf
建立指向某个对象的路径并在目录上迭代,我肯定不想用它创建
&str
。@BrendanWilson,它实际上是
AssetManager
结构的一种方法。所以它里面有一些额外的东西,比如缓存和验证。
let dog: Dog = create_animal("Spike");