问题标签 [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.
rust - 处理传递给程序宏的编译时相关文本文件的正确方法
我需要将文本文件或文本文件的内容传递给程序宏,以便程序宏在编译时根据该文本文件的内容进行操作。也就是说,文本文件配置了宏的输出。用例是定义宏构建到库中的寄存器映射的文件。
第二个要求是文本文件由 正确处理Cargo
,以便对文本文件的更改触发重新编译,就像对源文件的更改触发重新编译一样。
我最初的想法是使用宏创建一个static
字符串。include_str!
这解决了第二个要求,但我看不到如何将其传递给宏 - 那时我只有要传递的字符串的标识符:
我可以使用字符串文字中的文件名将字符串传递给宏,然后在宏内打开文件:
此时我有两个问题:
- 如何获取调用函数的路径以获取文件的路径并不明显。我最初认为这将通过 token 暴露出来
Span
,但总的来说似乎不是(也许我错过了一些东西?)。 - 如何使文件 make
Cargo
在更改时触发重新编译并不明显。我不得不强制这样做的一个想法是include_str!("myfile")
在宏的输出中添加一个,这有望导致编译器知道“myfile”,但这有点麻烦。
有什么办法可以做我想做的事吗?也许要么通过某种方式获取外部创建的宏内的字符串内容,要么可靠地获取调用 rust 文件的路径(然后Cargo
正确地进行处理更改)。
顺便说一句,我读过很多地方告诉我我无法访问宏内部变量的内容,但在我看来,这正是quote
宏正在做的事情#variables
。这是如何工作的?
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
我得到:
我在这里做错了什么?显然我缺少一些基本的东西。我没有正确导入宏吗?
rust - 我可以使用 Rust 的宏重复检测表达式是否是可变变量吗?
我不想使用($($x:ident),*)
. 宏可以记录表达式,然后log!
我想匹配变量类型。
rust - 如何在类似函数的过程宏中计算类型的实例并返回它?
我有类型Foo
:
现在我想创建一个过程宏来创建这个结构的一个实例。这可能涉及繁重的计算、文件访问或其他只有过程宏才能做的事情,但如何创建该实例的确切细节在这里并不重要。
我这样定义我的程序宏:
我的程序宏的用户应该能够这样写:
请注意,它Foo
可能包含大量数据,例如数兆字节的Vec
数据。
如何Foo
从我的程序宏中返回值?
rust - 如何创建类似函数的过程宏?
应该如何a_proc_macro
定义它“返回”一个 5?
rust - 在过程宏中,如何检查字符串是否是有效的变量名而不是关键字?
在过程宏中,我希望能够检查字符串是有效的变量名而不是关键字。
proc_macro2::Ident
如果尝试使用无效的变量名会惊慌,但它会允许我不想被允许的关键字。在恐慌之前使用漂亮且有用的错误消息来处理错误也会更好。
是否有一些宏或函数(在板条箱中或其他地方)会检查字符串是否符合关于变量名的规则?我可能可以用正则表达式来做到这一点,但龙生活在正则表达式中。
用例是处理用户输入字符串,其中可能包括垃圾字符串。
rust - 如何实现定义新公共类型并返回该类型实例的宏?
我想实现一个结构,macro_rules!
因为泛型需要大量的样板和特征搜索。
有问题的结构内部有一个哈希表,但键和值类型由用户提供。代码如下:
这不会编译,因为它试图将结构粘贴到主函数中:
我该如何解决它?如何将结构与impl
块一起公开粘贴到主函数之外?
rust - 使用 Rust 时,在派生宏中处理辅助属性的简化方法是什么?
使用 Rust 时,在派生宏中处理辅助属性的简化方法是什么?为了说明我在寻找什么,我定义了一个名为的派生宏Duplicate
,它创建一个新结构,其中包含旧结构中已由辅助属性标记的所有元素。基本上,它转
进入
代码的结构是
与mymacro/Cargo.toml
作为
并且lib.rs
作为
那么,mybin/Cargo.toml
是
并且main.rs
是
这产生
因此,这确实可以正常工作。同时,我忽略了相当多的错误检查,lib.rs
并使用了相当多的代码来深入查找帮助器属性。我有兴趣了解是否有更好的方法来生成这样的宏。
types - Rustlings Course Test4.rs 宏返回类型问题
我正在上 Rustlings Rust-lang课程并致力于exercises/test4.rs
这是课程中唯一没有提示的练习。因此,在研究了一段时间之后,我正在伸出手来获得这个提示!
当我尝试编译时,出现以下错误:
这个问题似乎是基于这样一个事实,即 Rust 宏的默认返回类型是一个空元组类型(即expected type ()
),当我们将它与静态字符串进行比较时。
如果练习的参数允许我更改主函数中的代码,那么练习似乎会更简单一些。但是,根据指令,唯一要做的就是编写一个宏来使代码编译。
据我了解,您不能显式声明宏的返回类型。所以我不知道如何进行。
rust - 我可以用 Rust 的可变参数宏“枚举”吗?
基本上我有一个看起来像这样的宏:
有什么可以进入$(some-macro-magic-here)
的,所以
将扩大到
?
有没有其他方法可以获得类似的功能,有效地让我“枚举”宏的输入序列?
我想我可能可以编写一个递归宏来获得类似的效果,但我想知道是否有比我想的更优雅/惯用的方式