gpt4 book ai didi

rust - 将模块存储为 Rust 中的变量

转载 作者:行者123 更新时间:2023-11-29 08:06:59 27 4
gpt4 key购买 nike

我有 2 个不同的模块,具有完全相同的实现、相同的功能、类型等。它们只是做不同的事情。我希望能够在运行时选择这些模块之一并专门使用它。此外,根据平台、功能等因素,这些模块中有几个可能在编译时存在,也可能不存在。this是指向我想要的 super 精简版的链接。我正在尝试在各种 gfx-hal 之间进行选择后端。我能想到的最好的是一个宏,它为每个可能的模块创建一个 if 语句,然后在模块中的函数运行时触发该 if 语句。然而,这看起来并不优雅或一点也不好。那么有没有一种方法可以将模块存储在一个变量中并对其进行访问,或者可以通过某种方式来模仿它?

提前致谢

最佳答案

你可以通过将你的每个模块变成它自己的特征实现来做到这一点,类似于 gfx-rs 的方式。做事。

你的“trait ”实际上永远不会用状态来实现,而是作为函数、其他类型等相关项的集合。

你可以把它打包成so :

#![allow(dead_code)]
mod foo {
pub fn print() { println!("hello from foo") }
}

mod bar {
pub fn print() { println!("hello from bar"); }
}

mod zam { // this may not exist depending on the platform, one will always exist
pub fn print() { println!("hello from zam"); }
}

struct FOO;
struct BAR;
struct ZAM;

trait RuntimeModule {
fn print();
}

impl RuntimeModule for FOO {
fn print() { foo::print(); }
}

impl RuntimeModule for BAR {
fn print() { bar::print(); }
}

impl RuntimeModule for ZAM {
fn print() { zam::print(); }
}

fn main() {
// Here we decide which to use
print_module::<FOO>();
}
// This is our "entrypoint"
fn print_module<T: RuntimeModule>() {
T::print();
}

如果我们决定在运行时使用哪个(在本例中为 main ),我们可以调用一个通用函数,该函数将使用关联的类型/函数来做出决定。

请注意,您将无法使用 Box<dyn RuntimeModule> 如果RuntimeModule包含对于每个实现都不同的关联类型。

关于rust - 将模块存储为 Rust 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58576230/

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