如何编写函数(或宏)来创建 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
和切片。
所以我有这样的东西:
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
和切片。