如何编写函数(或宏)来创建 Vec 和对它的引用?

How to write a function (or a macro) to create a Vec and a reference to it?

所以我有这样的东西:

let v = vec![...];
let s = Data { vec: &v, ... };

也许这是误导,但想法是许多数据结构可以共享同一个向量。但是对于我不想分享的情况,有这样的东西会很方便:

let (v, s) = make_data(...);

显然,与第一个示例不同,无法连接 v 和 s 的生命周期(如果我错了请纠正我)。无论如何,我知道借用检查员拒绝了这个。所以我最终做了:

let v = vec![];
let s = make_data(&v, ...);

现在,也许我可以完成其中一项工作:

let (v, s) = make_data!(...);
let s = make_data!(v, ...);
let s = make_data!(...);

这里的问题是这些宏会扩展成类似 { let v = vec![]; ... } 的东西,而 v 的析构函数将在这个块的末尾是 运行,但我真正想要的是让它扩展到类似于第一个例子的东西。

现在,我可以完成这项工作了:

make_data!(v, s, ...);

但这很奇怪。还有其他方法可以解决这个问题吗?

Rust 允许您在同一块中定义多个具有相同名称的变量。

let a = vec![...];
let a = Data { vec: &a, ... };

第二行,新的a还不在范围内,所以还是可以参考之前a的定义。但是,关于下面的语句,你不能再参考原来的a定义,因为第二个定义shadows第一个;然而,Vec 像往常一样一直存活到块结束。

您可以在宏中利用这一点,只需使用一个标识符并将其同时用于 Vec 和切片。