我想匹配,例如ident
的类型来实现某个特征,我该怎么做?
这里是(不完整)代码中的基本思想:
macro_rules! has_trait {
($ ($t : ty), ($x : ident),) => {
}
}
fn trait_test() {
let a = vec![1, 2, 3];
let b = 42;
let a_iteratable = has_trait!(IntoIterator, a);
let b_iteratable = has_trait!(IntoIterator, b);
println!("{:?} iterable? {}", a, a_iteratable);
println!("{:?} iterable? {}", b, b_iteratable);
}
我无法理解如何说“任何具有特征Foo
”的类型。
我看到 2 个选项来解决这个问题:
- 找到一个匹配表达式,匹配任何具有特征
$t
的类型,并简单地在匹配时返回 true,否则(否则如何工作?)false。 - 在任何类型的匹配体中,使用一些代码来确定特征
$t
是否由$x
的类型实现。
我不知道如何执行这两个选项中的任何一个。
这能做到吗?
最佳答案
恐怕这里对宏能做什么和不能做什么存在严重的误解。
在 Rust 中,宏作用于 AST,抽象 语法 树的缩写。这意味着它可以访问句法信息(仅)。
这意味着宏所做的任何事情,您也可以在没有宏的情况下完成。宏只是语法糖,可以避免一遍又一遍地编写样板文件。
反之,如果没有宏就不能做某事,那么你也不能用宏来做。
我不是很清楚这些信息是否可用(证明是否定的总是很困难),但可以肯定的是宏的使用对这种可用性没有影响。
关于macros - 是否可以编写 Rust 宏 "has_trait!(<type>,<ident>|<expr>)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824384/