Generics 我可以在Rust中使用泛型函数参数来创建新变量吗?

Generics 我可以在Rust中使用泛型函数参数来创建新变量吗?,generics,rust,Generics,Rust,是否可以在Rust中创建泛型参数类型的实例 我来自C++背景,在实际函数体中使用模板类型来创建类型完全有效。 我试图在此函数中创建一个类型为T的变量,但我不确定如何创建 我只希望能够创建类型为T的对象,加载它,然后将其插入HashMap: fn load<T>(&mut self, id: String, path: String) where T: AssetTrait + 'static { // let asset : T = T; this doesn

是否可以在Rust中创建泛型参数类型的实例

我来自C++背景,在实际函数体中使用模板类型来创建类型完全有效。 我试图在此函数中创建一个类型为

T
的变量,但我不确定如何创建

我只希望能够创建类型为
T
的对象,加载它,然后将其插入
HashMap

fn load<T>(&mut self, id: String, path: String)
    where T: AssetTrait + 'static
{
    // let asset : T = T; this doesn't work?

    asset.load(path);

    // self.assets.insert(id, Box::new<T>(asset));
}
fn加载(&mut self,id:String,path:String)
其中T:AssetTrait+'静态
{
//让资产:T=T;这不起作用?
加载(路径);
//insert(id,Box::new(asset));
}
以下是我的全部代码:

trait AssetTrait {
    fn load(&self, path: String) {
        // Do nothing
        // Implement this in child asset object
    }
}

struct AssetManager {
    assets: HashMap<String, Box<AssetTrait + 'static>>,
}

impl AssetManager {
    fn new() -> AssetManager {
        let asset_manager = AssetManager { assets: HashMap::new() };

        return asset_manager;
    }

    fn load<T>(&mut self, id: String, path: String)
        where T: AssetTrait + 'static
    {
        // let asset : T = T; this doesn't work?

        asset.load(path);

        // self.assets.insert(id, Box::new<T>(asset));
    }
}
trait资产{
fn加载(&self,路径:字符串){
//无所事事
//在子资产对象中实现此功能
}
}
结构资产管理器{

资产:C++中的HashMap

当你声明一个变量,如T资产; >你假设>T/Obj>有一个默认构造函数(编译时版本的鸭式输入)。它是一个编译器错误,用一个没有默认构造函数的类型来实例化<代码> t>代码>,但是如果没有这样的实例化,它是可以的。 在Rust中,您不能“假定”类型参数支持操作。您必须使用类型参数的边界指定支持的操作

也就是说,您必须选择:

AssetTrait

例如,您可以将
load
声明为不接受
self
参数并返回
self
的关联函数,并调用
T::load(path)
实例化
T

use std::collections::HashMap;

trait AssetTrait {
    fn load(path: String) -> Self;
}

struct AssetManager {
    assets: HashMap<String, Box<AssetTrait + 'static>>,
}

impl AssetManager {
    fn new() -> AssetManager {
        let asset_manager = AssetManager { assets: HashMap::new() };
        return asset_manager;
    }

    fn load<T>(&mut self, id: String, path: String)
        where T: AssetTrait + 'static
    {
        let asset = T::load(path);
        self.assets.insert(id, Box::new(asset));
    }
}

我让它工作,但我必须改变“资产”第二个示例中的变量是可变的,以使加载函数正常工作。这是有意义的,
load
将修改
self
。注意:impl块中的每个fn都是一个关联的fn。对于那些采用self的fn,我们有一个更具体的名称,即方法,但方法是关联的函数。@SteveKlabnik感谢Steve.I更新了答案,删除了此错误。
use std::collections::HashMap;

trait AssetTrait {
    fn load(&mut self, path: String);
}

struct AssetManager {
    assets: HashMap<String, Box<AssetTrait + 'static>>,
}

impl AssetManager {
    fn new() -> AssetManager {
        let asset_manager = AssetManager { assets: HashMap::new() };
        return asset_manager;
    }

    fn load<T>(&mut self, id: String, path: String)
        where T: Default + AssetTrait + 'static
    {
        let mut asset = T::default();
        asset.load(path);
        self.assets.insert(id, Box::new(asset));
    }
}