macros - 是否可以编写 Rust 宏 "has_trait!(<type>,<ident>|<expr>)"?

标签 macros rust

我想匹配,例如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 个选项来解决这个问题:

  1. 找到一个匹配表达式,匹配任何具有特征 $t 的类型,并简单地在匹配时返回 true,否则(否则如何工作?)false。
  2. 在任何类型的匹配体中,使用一些代码来确定特征$t是否由$x的类型实现。

我不知道如何执行这两个选项中的任何一个。

这能做到吗?

最佳答案

恐怕这里对宏能做什么和不能做什么存在严重的误解。

在 Rust 中,宏作用于 AST,抽象 语法 树的缩写。这意味着它可以访问句法信息(仅)。

这意味着宏所做的任何事情,您也可以在没有宏的情况下完成。宏只是语法糖,可以避免一遍又一遍地编写样板文件。

反之,如果没有宏就不能做某事,那么你也不能用宏来做。

我不是很清楚这些信息是否可用(证明是否定的总是很困难),但可以肯定的是宏的使用对这种可用性没有影响。

关于macros - 是否可以编写 Rust 宏 "has_trait!(<type>,<ident>|<expr>)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824384/

相关文章:

qt - 如果使用 CMAKE 作为构建系统,如何为 mingw 定义 UNICODE

c++ - 我的宏函数有什么问题?

macros - Julia:如何创建一个返回其参数的宏?

rust - Rust 宏可以跨版本共享吗?

rust - 函数可以接受 Option 或 &str 或 String 类型的参数吗?

rust - 是否可以在 Rust 中打印以千位分隔符格式化的数字?

c++ - 可以做 "#ifdef DEBUG( ... ) __VA_ARGS__"吗?

dependencies - Cargo 无法下载 nom v0.5.0

rust - 如何使用Serde在反序列化期间转换字段?

rust - 这是按值捕获字符串的正确方法吗?