Generics 我可以在Rust中使用泛型函数参数来创建新变量吗?
是否可以在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
我来自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));
}
}