rust - 根据类型别名使用导入的宏

标签 rust

我有一个类型别名 pub type Float = std::f64如果我愿意,我可以将其更改为 f32。

问题是我需要使用 std::f32 或 f64 库中的 PI。解决这个问题的方法是使用一个可以扩展为正确使用声明的宏。

我遇到的第一个问题是我不知道如何扩展Float .

macro_rules! more {
($x:tt) => (stringify!(x));
}

给我“ float ”而不是“std::f64”。有可能以这种方式解决这个(和我的一般问题)吗?

编辑:

基本上我的最终目标是这样的:
macro_rules! final {

($x:tt) => (use_correct_import!(x)); // use std::f32 or use::std::f64 depending on Float

}

最佳答案

您需要定义两个别名:一个用于类型本身,一个用于包含常量的模块。您当然可以直接使用这两个声明:

use std::f64 as float;
type Float = f64;

fn main() {
    let pi: Float = float::consts::PI;
    println!("{}", pi);
}

但是如果你想有一个可以在两者之间切换的地方,你可以使用这样的宏:
macro_rules! define_float {
    ($f:tt) => {
        use std::$f as float;
        type Float = $f;
    }
}

define_float!(f64);

fn main() {
    let pi: Float = float::consts::PI;
    println!("{}", pi);
}

关于rust - 根据类型别名使用导入的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61835421/

相关文章:

debugging - 在Clion中调试Rust会生成 “Error creating process”

python - 如何在 Alpine docker镜像中为orjson python库设置rust工具链?

asynchronous - 生命周期绑定(bind)在异步函数中,这也是一个参数

rust - Rust 中的迭代器类型

rust - 当多个日志记录目的地与 rust 跟踪库一起使用时,如何限制日志级别?

dynamic - 如何为 Box<dyn Trait> 字段指定关联类型的值?

generics - 为什么不能将 `&(?Sized + Trait)` 转换为 `&dyn Trait` ?

multithreading - 如何可靠地清理执行阻塞 IO 的 Rust 线​​程?

rust - 从 Option<T> 中提取类型 T

rust - 如何修复我的 Cargo 文件中不匹配的依赖项以解决 native 库冲突?