在Rust中,是否有一种动态引用模块及其函数的方式?

8

我正在完成Advent of Code 2021,我的main.rs文件看起来像这样:

// # Day 1
    if day1::is_complete() && print_complete || !day1::is_complete() {
        day1::part1();
        day1::part2();
    } else {
        println!("✅ Day 1 finished!")
    }

    // # Day 2
    if day2::is_complete() && print_complete || !day2::is_complete() {
        day2::part1();
        day2::part2();
    } else {
        println!("✅ Day 2 finished!")
    }

...

这将持续25天。

每个模块都有一个名为part1part2的函数。

是否有一种类似于Python中eval这样更简洁的方式来实现这样的功能?

for day in 1..=25 {
   let mod_name = convert_to_mod_name(day);
   if mod_name::is_complete() && print_complete || !mod_name::is_complete() {
        mod_name::part1();
        mod_name::part2();
    } else {
        println!("✅ Day {day} finished!", day);
    }
   

3
在Rust中,模块不是一等对象。你最好的选择是将每一天都作为一个结构体,所有这些结构体都实现了一个共同的trait,指定如何“评估”它。 - Silvio Mayolo
1
你可以使用宏来实现类似的功能,但是如果不调用 rustc 的话就无法完全实现。 - Chayim Friedman
我在想,有进展了吗?我有一个类似的问题。 - liby
没有,这方面没有进展。 - Lacrosse343
1个回答

3

是否有一种类似于Python eval 的更简洁的方法来执行此操作?

没有。Python 是一种动态语言,而 Rust 是一种静态编译语言。

最接近的方法是加载动态链接库。Rust 没有稳定的 ABI,除了一小部分用于 FFI 的子集外。这本质上是不安全的。

简而言之:对于像 “Advent of Code” 这样的东西,这不值得去做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接