问题标签 [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 投票
2 回答
510 浏览

generics - 指定泛型参数属于一小组类型

是否可以将泛型参数限制为少数几种类型之一,而无需弄清楚哪些特征精确定义了这些类型?例如

有时要弄清楚要添加哪些特征才能where获得所需的类型很乏味,有时即使由于语义而具有语法意义,也不想允许类型。

0 投票
1 回答
6032 浏览

rust - 如何在宏中调用自身的方法?

以上不起作用(Playground):

我不明白为什么这不起作用:宏是在self可用的方法中调用的!这有可能吗?我是否应该传入self宏,否则宏无法解析self

我每晚使用 rustc 1.19.0。

0 投票
2 回答
3879 浏览

rust - 如何使用一系列参数初始化结构

在许多语言中,一个常见的构造函数习惯用法是使用类似以下伪代码的语法来初始化对象的值:

Rust 起初似乎也不例外。许多包含一个构造函数,impl用于将一系列有序的参数压缩到结构的字段中:structnew

使用宏执行此操作可能看起来像zip!(Circle, 52, 32, 5). 它会将值按顺序压缩到Circle. 两者zip!(Circle, 52, 32)zip!(Circle, 52, 32, 5, 100)都会出现问题,但是像这样的宏将是一种非常灵活的方式,可以将值推送到任何结构的新实例上,而无需太多样板。

有没有一种惯用的方法来简化这个样板?如何在不显式编写样板代码的情况下将一系列有序参数映射到结构的每个字段?

0 投票
0 回答
47 浏览

rust - 通过插件将自定义派生宏引入命名空间

是否可以从以下方面减少使用库(作为库作者)的样板:

更像是:

也就是说,既然我知道任何使用myplugin想要使用的人#[derive(MyPlugin)],有没有办法只将其MyPlugin纳入范围#![plugin(myplugin)]

0 投票
1 回答
566 浏览

rust - 如何根据使用宏的体系结构定义具有不同调用约定的函数?

我正在用 Rust 开发一种小语言。为了提高性能,我想使用 x86 的 fastcall 调用约定。"fastcall"ARM 不支持 ABI 。

对于 x86:

对于 ARM:

使用 CI 可以定义宏

我不知道如何使用 Rust 的宏系统来解决这个问题。

编辑:

我需要两个不同的宏。我知道如何使用 target_arch 来定义不同版本的函数,但不知道宏。

0 投票
1 回答
96 浏览

rust - 尝试在宏扩展中实现特征时出现宏错误

fn a() {}似乎满足了预期 a 的解析规则fn,然后是其他一些东西。items 应该可以是函数定义,对吧?所以他们应该工作,对吧?

操场

有问题的错误:

使它$( fn $i)*只会更改错误以抱怨在 之后需要一个标识符fn,这是有道理的,但最初的错误没有(至少对我而言)。

解析器对源代码中的代码与宏放入源代码中的代码有区别吗?

0 投票
1 回答
616 浏览

rust - 宏生成代码中未使用的变量

我编写了一个宏,它在 Rust 中实现了类似 Scala 的理解。它会变成这样:

进入这个:

这可行,但编译器会发出“未使用的变量”警告,因为x没有在flat_map. #[allow(unused_variables)]我可以通过在宏中的语句之前添加来禁用警告let,但随后它会删除所有未使用的变量警告,因此:

将扩展为:

即使x真的没有使用,也不会产生警告。

有没有办法让第一个例子不会产生警告,但第二个例子会?

可以使用带有警告的宏的完整代码,以及带有警告被抑制的完整代码。

0 投票
2 回答
500 浏览

macros - 匹配宏中的下划线而不是 ident

我正在创建一个匹配两个表达式和一个标识符的宏。如果不需要标识符,我希望能够忽略它,但如果我_在那里使用,编译器似乎会抱怨。

我的宏:

我想做的事:

第二次调用失败。

if_some_!我通过定义第二个不接收标识符的宏来解决它(我也不能使用第二个模式)。我确信有一种方法可以说“这里接受一个标识符或只是_.

也许已经有一个宏/功能(就像Option::map现在我想的那样)......不过现在会很好。

0 投票
2 回答
2214 浏览

rust - 有没有办法在不重复变量名的情况下将命名参数传递给格式化宏?

使用新版本的 Rust,您可以像这样简化结构初始化:

对此

format!是否可以为/ println!-like 宏做类似的事情?

现在我需要这样写:

是否可以使用这样的 API 编写我自己的宏:

0 投票
2 回答
395 浏览

rust - Is it possible to create a macro that implements Ord by delegating to a struct member?

I have a struct:

I want to create a Vec<Student> that can be sorted by last_name. I need to implement Ord, PartialOrd and PartialEq:

This can be quite monotonous and repetitive if you have a lot of structs with an obvious field to sort by. Is it possible to create a macro to automatically implement this?

Something like:

I found Automatically implement traits of enclosed type for Rust newtypes (tuple structs with one field), but it's not quite what I'm looking for.