问题标签 [rust-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
802 浏览

rust - 处理传递给程序宏的编译时相关文本文件的正确方法

我需要将文本文件或文本文件的内容传递给程序宏,以便程序宏在编译时根据该文本文件的内容进行操作。也就是说,文本文件配置了宏的输出。用例是定义宏构建到库中的寄存器映射的文件。

第二个要求是文本文件由 正确处理Cargo,以便对文本文件的更改触发重新编译,就像对源文件的更改触发重新编译一样。

我最初的想法是使用宏创建一个static字符串。include_str!这解决了第二个要求,但我看不到如何将其传递宏 - 那时我只有要传递的字符串的标识符:

我可以使用字符串文字中的文件名将字符串传递给宏,然后在宏内打开文件:

此时我有两个问题:

  1. 如何获取调用函数的路径以获取文件的路径并不明显。我最初认为这将通过 token 暴露出来Span,但总的来说似乎不是(也许我错过了一些东西?)。
  2. 如何使文件 makeCargo在更改时触发重新编译并不明显。我不得不强制这样做的一个想法是include_str!("myfile")在宏的输出中添加一个,这有望导致编译器知道“myfile”,但这有点麻烦。

有什么办法可以做我想做的事吗?也许要么通过某种方式获取外部创建的宏内的字符串内容,要么可靠地获取调用 rust 文件的路径(然后Cargo正确地进行处理更改)。

顺便说一句,我读过很多地方告诉我我无法访问宏内部变量的内容,但在我看来,这正是quote宏正在做的事情#variables。这是如何工作的?

0 投票
1 回答
1887 浏览

import - Rust:找不到宏

我正在尝试从postgres_types文档中运行 rust 代码。

示例代码可以在这里找到:postgres_types

我的生锈环境:

cargo --version cargo 1.40.0-nightly (5da4b4d47 2019-10-28)

rustc --version rustc 1.40.0-nightly (b520af6fd 2019-11-03)


main.rs


货运.toml


当我尝试运行时,cargo run我得到:

我在这里做错了什么?显然我缺少一些基本的东西。我没有正确导入宏吗?

0 投票
1 回答
115 浏览

rust - 我可以使用 Rust 的宏重复检测表达式是否是可变变量吗?

我不想使用($($x:ident),*). 宏可以记录表达式,然后log!我想匹配变量类型。

0 投票
1 回答
424 浏览

rust - 如何在类似函数的过程宏中计算类型的实例并返回它?

我有类型Foo

现在我想创建一个过程宏来创建这个结构的一个实例。这可能涉及繁重的计算、文件访问或其他只有过程宏才能做的事情,但如何创建该实例的确切细节在这里并不重要。

我这样定义我的程序宏:

我的程序宏的用户应该能够这样写:

请注意,它Foo可能包含大量数据,例如数兆字节的Vec数据。

如何Foo从我的程序宏中返回值?

0 投票
2 回答
2993 浏览

rust - 如何创建类似函数的过程宏?

应该如何a_proc_macro定义它“返回”一个 5?

0 投票
1 回答
346 浏览

rust - 在过程宏中,如何检查字符串是否是有效的变量名而不是关键字?

在过程宏中,我希望能够检查字符串是有效的变量名而不是关键字。

proc_macro2::Ident如果尝试使用无效的变量名会惊慌,但它会允许我不想被允许的关键字。在恐慌之前使用漂亮且有用的错误消息来处理错误也会更好。

是否有一些宏或函数(在板条箱中或其他地方)会检查字符串是否符合关于变量名的规则?我可能可以用正则表达式来做到这一点,但龙生活在正则表达式中。

用例是处理用户输入字符串,其中可能包括垃圾字符串。

0 投票
1 回答
232 浏览

rust - 如何实现定义新公共类型并返回该类型实例的宏?

我想实现一个结构,macro_rules!因为泛型需要大量的样板和特征搜索。

有问题的结构内部有一个哈希表,但键和值类型由用户提供。代码如下:

这不会编译,因为它试图将结构粘贴到主函数中:

我该如何解决它?如何将结构与impl块一起公开粘贴到主函数之外?

0 投票
0 回答
623 浏览

rust - 使用 Rust 时,在派生宏中处理辅助属性的简化方法是什么?

使用 Rust 时,在派生宏中处理辅助属性的简化方法是什么?为了说明我在寻找什么,我定义了一个名为的派生宏Duplicate,它创建一个新结构,其中包含旧结构中已由辅助属性标记的所有元素。基本上,它转

进入

代码的结构是

mymacro/Cargo.toml作为

并且lib.rs作为

那么,mybin/Cargo.toml

并且main.rs

这产生

因此,这确实可以正常工作。同时,我忽略了相当多的错误检查,lib.rs并使用了相当多的代码来深入查找帮助器属性。我有兴趣了解是否有更好的方法来生成这样的宏。

0 投票
2 回答
438 浏览

types - Rustlings Course Test4.rs 宏返回类型问题

我正在上 Rustlings Rust-lang课程并致力于exercises/test4.rs

这是课程中唯一没有提示的练习。因此,在研究了一段时间之后,我正在伸出手来获得这个提示!

当我尝试编译时,出现以下错误:

这个问题似乎是基于这样一个事实,即 Rust 宏的默认返回类型是一个空元组类型(即expected type ()),当我们将它与静态字符串进行比较时。

如果练习的参数允许我更改主函数中的代码,那么练习似乎会更简单一些。但是,根据指令,唯一要做的就是编写一个宏来使代码编译。

据我了解,您不能显式声明宏的返回类型。所以我不知道如何进行。

0 投票
2 回答
329 浏览

rust - 我可以用 Rust 的可变参数宏“枚举”吗?

基本上我有一个看起来像这样的宏:

有什么可以进入$(some-macro-magic-here)的,所以

将扩大到

?

有没有其他方法可以获得类似的功能,有效地让我“枚举”宏的输入序列?

我想我可能可以编写一个递归宏来获得类似的效果,但我想知道是否有比我想的更优雅/惯用的方式