是否可以编写一个 Rust 宏“has_trait!(,|)”?

2024-03-08

我想匹配,例如一个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".

我看到有两种解决问题的选择:

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

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

这还可以吗?


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

在 Rust 中,宏作用于 AST(Abstract 的缩写)Syntax树。这意味着它可以访问句法的仅供参考)。

这意味着宏可以执行的任何操作,无需宏也可以执行。一个宏是just语法糖以避免一遍又一遍地编写样板。

相反,如果没有宏就无法完成某件事,那么使用宏也无法完成该任务。

我并不清楚这些信息是否可用(证明负面信息总是那么困难),但是可以肯定的是,宏的使用不会影响这种可用性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以编写一个 Rust 宏“has_trait!(,|)”? 的相关文章

  • 用宏包装函数(无需重命名)C

    我有兴趣通过包装现有函数调用来添加一些额外的逻辑without重命名它们 仅供测试 我发现的现有解决方案依赖于将函数包装在不同名称的宏中 这可能意味着更改大量代码 有什么建议么 请注意 我知道LD PRELOAD 但我有兴趣使用宏来检查传递
  • 如何运行 Abaqus 宏 (.py) 脚本

    我是Python新手 我使用 Abaqus 宏管理器生成了一个宏 它是一个 py 脚本 我意识到该脚本仅在从 Abaqus 管理器运行时才有效 并且不能自行运行 请有人知道如何修改这个脚本 以便我可以在不使用 Abaqus 的情况下运行它
  • 你能克隆一个闭包吗?

    A FnMut由于显而易见的原因 闭包无法被克隆 但是Fn闭包具有不可变的范围 有没有办法创建一个 重复 Fn关闭 尝试克隆它会导致 error E0599 no method named clone found for type std
  • Rust 中为什么有 mod 关键字?

    看完之后this https doc rust lang org book crates and modules html 我想知道为什么有一个mod关键字和mod rs 我假设目录层次结构也可以描述模块 必须显式声明模块有几个原因 模块可
  • Xcode 中定义的宏 CURRENT_PROJECT_VERSION 在哪里?

    这个帖子如何在 xcode 8 中设置 CURRENT PROJECT VERSION https stackoverflow com questions 39673280 how to set current project versio
  • serde/bincode 如何序列化字节数组?

    这段代码完全按照我的要求序列化了一个 32 字节的数组 derive Debug Clone Serialize Deserialize PartialEq Eq PartialOrd Ord struct Hash u8 32 let h
  • 为什么在特征中返回“Self”可以工作,但返回“Option”需要“Sized”?

    这个特征定义编译得很好 trait Works fn foo gt Self 然而 这确实会导致错误 trait Errors fn foo gt Option
  • 如何将动态格式字符串与格式一起使用!宏?

    我想使用format 宏与String作为第一个参数 但因为宏需要字符串文字 所以我无法传递任何与它不同的内容 我想这样做是为了将字符串动态添加到当前字符串中 以便在视图引擎中使用 如果有更好的方法 我愿意接受建议 let test Str
  • 可变借用不止一次[重复]

    这个问题在这里已经有答案了 这是无法编译的简短示例的简短示例 错误在于add1功能 如果我这样做的话它会起作用add2 但这不是很干 有更多经验的人能否启发我如何以比以前更好的方式克服可变借用错误 add2 struct S1 full b
  • 宏未产生所需的结果

    我是 C 新手 之前来自 Python 我对这部分代码感到困惑 include
  • 实现 Index 特征以返回非引用的值

    我有一个想要实现的简单结构Index 但作为 Rust 的新手 我在借用检查器方面遇到了许多麻烦 我的结构非常简单 我想让它存储一个起始值和步骤值 然后当由usize它应该返回start idx step pub struct MyStru
  • 是否可以从外部文件运行 openoffice 宏?

    我想从外部文件运行 OpenOffice 宏 喜欢 vlad leo soffice macro home vlad q vbs 并不是真正的答案 只是一个评论 以便提出这个问题 并希望得到答案 这可能与必须显式设置宏的权限有关 例如 编辑
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 尝试实现查找或插入时 HashMap 借用问题

    我尝试实现自己的类似物find or insert方法看起来像这样 use std collections HashMap pub struct SomeManager next i32 types HashMap
  • C 预处理器宏不解析逗号分隔的标记?

    我想根据参数的数量选择两个函数之一 nargs 0 gt f1 nargs gt 0 gt f2 宏执行以下操作 获取第一个参数 如果没有提供参数 则会添加两个逗号 NULL NULL 然后它会从返回的参数列表中选择第二个参数 例如 f H
  • Box 与 X 上的移动语义

    我有一个简单的问题Box
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的
  • 在不同端口上运行多个 actix 应用程序

    我正在尝试运行两个应用程序 一个在端口 3006 上进行管理 另一个在端口 8080 上提供数据 他们共享数据库池 缓存 对于 actix 1 0 我可以这样做 我不知道这是否是最好的方法 let server Server build F
  • 获取当前线程 id 和进程 id 作为整数?

    有没有办法以整数形式获取 Rust 中的当前进程 ID 和线程 ID 我得到的最接近的是 std thread current id 它返回一个不透明的ThreadId目的 当尝试访问其u64场 我得到 error E0611 field
  • 变量在嵌套 lambda 中生存时间不够长的借用检查错误

    我在嵌套 lambda 中遇到错误 let rows vec vec 3 6 2 8 9 0 vec 0 0 1 4 5 1 let pair sums rows iter flat map row 0 row len map i row

随机推荐