mirror of https://github.com/sunface/rust-course
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
858 B
35 lines
858 B
3 years ago
|
## struct中的一个字段是另外一个字段的指针
|
||
|
```rust
|
||
|
#[derive(Debug)]
|
||
|
struct Test {
|
||
|
a: String,
|
||
|
b: *const String,
|
||
|
}
|
||
|
|
||
|
impl Test {
|
||
|
fn new(txt: &str) -> Self {
|
||
|
Test {
|
||
|
a: String::from(txt),
|
||
|
b: std::ptr::null(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn init(&mut self) {
|
||
|
let self_ref: *const String = &self.a;
|
||
|
self.b = self_ref;
|
||
|
}
|
||
|
|
||
|
fn a(&self) -> &str {
|
||
|
&self.a
|
||
|
}
|
||
|
|
||
|
fn b(&self) -> &String {
|
||
|
assert!(!self.b.is_null(), "Test::b called without Test::init being called first");
|
||
|
unsafe { &*(self.b) }
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Test provides methods to get a reference to the value of the fields a and b. Since b is a reference to a we store it as a pointer since the borrowing rules of Rust doesn't allow us to define this lifetime. We now have what we call a self-referential struct.
|
||
|
|