我有一个类型别名 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/