使用旧Rust 2015
0.1.2 |
|
---|---|
0.1.1 |
|
0.1.0 |
|
#24 在 #self-referential
7KB
60 代码行
Self-Ref
此crate公开了宏self_referencing!
,允许创建结构体,其中字段包含对同一结构体中其他字段的引用。
这是针对以下问题的一个临时解决方案:[链接](https://gist.github.com/tomaka/da8c374ce407e27d5dac)
如果此模式可以通过安全Rust代码实现,则此crate将停止维护。
文档
用法
添加到您的Cargo.toml文件中
[dependencies]
self-ref = "0.1"
使用宏如下所示
#![allow(unused_variables)]
#[macro_use]
extern crate self_ref;
struct Galaxy<'a> {
pub name: &'a str,
}
struct StarSystem<'a> {
pub galaxy: &'a Galaxy<'a>,
pub name: &'a str,
}
struct Star<'a> {
pub system: &'a StarSystem<'a>,
pub name: &'a str,
}
struct Assets<'a> {
pub galaxy: Galaxy<'a>,
pub system: StarSystem<'a>,
pub star: Star<'a>,
}
fn main() {
let assets = self_referencing!(Assets, {
galaxy = Galaxy { name: "Milky Way" };
system = StarSystem { galaxy: &galaxy, name: "Solar System", };
star = Star { system: &system, name: "Sol", };
});
assert_eq!("Milky Way", assets.galaxy.name);
assert_eq!("Solar System", assets.system.name);
assert_eq!("Sol", assets.star.name);
assert_eq!(assets.system.name, assets.star.system.name);
assert_eq!(assets.galaxy.name, assets.system.galaxy.name);
assert_eq!(assets.galaxy.name, assets.star.system.galaxy.name);
}
安全性
您必须始终为结构体的所有字段分配值。如果不这样做,其他字段将未初始化,并且可能会(并且很可能会)导致崩溃。