老实说,我不知道这个标题是否能很好地描述我的问题。我自己也不知道是什么问题。
我总是出错。
My Code is
// main.rs
#[derive(Debug)]
struct A<'a> {
f1: B<'a>,
f2: i32,
}
#[derive(Debug)]
struct B<'a> {
f1: Vec<&'a str>,
}
impl<'a> A<'a> {
fn new() -> Self {
Self {
f1: B::new(),
f2: 0,
}
}
fn set_f1(&mut self, b: B<'a>) {
self.f1 = b;
}
fn get_f1(&mut self) -> &mut B {
&mut self.f1
}
fn execute(&mut self) {
self.get_f1().set_f1()
}
}
impl<'a> B<'a> {
fn new() -> Self {
Self {
f1: vec!["string literal"],
}
}
fn set_f1(&mut self) {
self.f1 = vec!["changed"]
}
}
fn main() {
let mut a = A::new();
let mut b = B::new();
let mut b2 = B::new();
a.set_f1(b); // for testing
a.set_f1(b2); // for testing
a.execute();
// a.get_f1().set_f1(); this is working here but not in method execute. Why?
}
这是一个完美的示例副本(更简单的版本,忽略所有其他字段和方法)代码。
我别无选择,只能使用字符串字面量&str
而不是String
,因为它更容易进行模式匹配。
所以,我引入了生命周期。我不知道这是对还是错,还是最好的做法之一。
我需要一个字段A
的f1
是一个可变的,所以我可以改变B
的f1
字段。
如何实现?
我尝试了一些方法,这里是代码的链接。https://play.rust-lang.org/?version=stable&模式= debug&版= 2018,要点= 338 c30cb225a3a48f71c250affea8623
fn get_f1(&mut self) -> &mut B<'a> {
&mut self.f1
}
你应该显式地定义get_f1
返回值的生存期