gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:05:20 25 4
gpt4 key购买 nike

是否可以在 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));
}

这是我所有的代码:

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));
}
}

最佳答案

在 C++ 中,当你声明一个像 T asset; 这样的变量时,你假设 T 有一个默认构造函数(鸭子类型的编译时版本)。使用没有默认构造函数的类型实例化 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));
}
}

使用一个预定义的特征,它有一个类似关联函数的构造函数

在 Rust 中,Default trait 用于此目的:

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));
}
}

关于generics - 我可以在 Rust 中使用泛型函数参数来创建新变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37335021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com