gpt4 book ai didi

macros - Rust 宏不匹配传递的类型

转载 作者:行者123 更新时间:2023-11-29 07:52:57 24 4
gpt4 key购买 nike

直接传递给宏的类型与您期望的模式匹配,但如果它们作为 ty 通过另一个宏传递,它们将停止匹配:

macro_rules! mrtype {
( bool ) => ("b");
( i32 ) => ("i");
( f64 ) => ("f");
( &str ) => ("z");
( $_t:ty ) => ("o");
}

macro_rules! around {
( $t:ty ) => (mrtype!($t));
}

fn main() {
println!("{}{}{}", mrtype!(i32), around!(i32), around!(&str));
}

这会打印 ioo 而不是 iiz

传递 tt 而不是 ty 是可行的,但是如果你有 &str 你需要 2 tt ,让一切变得不必要的复杂。

最佳答案

这不起作用,也无法使其起作用。

总结Captures and Expansion Redux chapter of The Little Book of Rust Macros : 问题在于,除了 ttident 捕获外,macro_rules! 完全无法解构或检查捕获的标记。一旦您将某些东西捕获为 ty,它就不可撤销地变成了 macro_rules! 的黑匣子。

换句话说:就 macro_rules! 而言,&str 不是一种类型:它是两个标记,&字符串。但是,当您捕获然后将 &str 替换为 ty 时,它变成了单个“元标记”:&str 类型。两者不再相同,因此不匹配。

如果您打算稍后匹配或解构标记,您必须将它们捕获为ttident(如果可能)。在这种特定情况下,您可以重写 around 的规则,改为 ($($t:tt)*) => (mrtype!($( $t)*));,它保留了原始的标记序列。

关于macros - Rust 宏不匹配传递的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35536273/

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