#self-referential #structs #creation #macro

已删除 self-ref

允许创建自引用结构体

使用旧Rust 2015

0.1.2 2016年4月21日
0.1.1 2016年4月21日
0.1.0 2016年4月21日

#24#self-referential

MIT 许可证

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);
}

安全性

您必须始终为结构体的所有字段分配值。如果不这样做,其他字段将未初始化,并且可能会(并且很可能会)导致崩溃。

无运行时依赖