OOP Rust中的构造函数和setter中的值不够长

问题描述 投票:0回答:2

我有以下代码:

//! # Messages

/// Represents a simple text message.
pub struct SimpleMessage<'a> {
    pub user: &'a str,
    pub content: &'a str,
}

impl<'a> SimpleMessage<'a> {

    /// Creates a new SimpleMessage.
    fn new_msg(u: &'a str, c: &'a str) -> SimpleMessage<'a> {
        SimpleMessage { user: u,
                        content: &c.to_string(), }
    }

    /// Sets a User in a Message.
    pub fn set_user(&mut self, u: User<'a>){
        self.user = &u;
    }
}

但是$ cargo run回归:

error[E0597]: borrowed value does not live long enough
  --> src/messages.rs:34:35
   | 
34 |                         content: &c.to_string(), }
   |                                   ^^^^^^^^^^^^^ temporary value does not live long enough
35 |     }
   |     - temporary value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 28:1...
   |
28 | impl<'a> SimpleMessage<'a> {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0597]: `u` does not live long enough
   |
54 |         self.user = &u;
   |                      ^ borrowed value does not live long enough
55 |     }
   |     - borrowed value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 28:1...
  --> src/messages.rs:28:1
   |
28 | impl<'a> SimpleMessage<'a> {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^

我已经尝试在函数签名处更改变量的借用格式并且它的内容没有成功,它似乎不是一个借用问题,但我真的不理解它,因为在<'a>定义的生命周期pub struct SimpleMessage<'a>明确指定它的组件寿命最长,impl<'a> SimpleMessage<'a>使用相同的寿命。

我错过了什么?

类似的问题:“borrowed value does not live long enough” when using the builder pattern真的没有帮助解决这个问题。

oop rust lifetime
2个回答
2
投票

str.to_string()将创建一个拥有的String,它不会比new_msg方法更长寿,所以你将无法在任何地方传递它。相反,只需使用&str参数,因为它对生命周期'a有效,这是你需要的。

/// Creates a new SimpleMessage.
fn new_msg(u: &'a User, c: &'a str) -> SimpleMessage<'a> {
    SimpleMessage { user: u, content: c, }
}

另一种方法也有问题。你试图给一个拥有的User,但SimpleMessage结构需要一个参考。它应该如下所示:

/// Sets a User in a Message.
pub fn set_user(&mut self, u: &'a User<'a>){
    self.user = u;
}

0
投票

如果要存储对字符串的引用,则不需要to_string。此外,set_user还必须采用引用,而不是值(因为结构中没有字段存储它):

pub struct User<'a> {
    pub data: &'a u8,
}

/// Represents a simple text message.
pub struct SimpleMessage<'a> {
    pub user: &'a User<'a>,
    pub content: &'a str,
}

impl<'a> SimpleMessage<'a> {
    fn new_msg(user: &'a User, content: &'a str) -> SimpleMessage<'a> {
        SimpleMessage { user, content }
    }

    pub fn set_user(&mut self, user: &'a User<'a>) {
        self.user = user;
    }
}

fn main() {
    let data1 = 1;
    let data2 = 2;
    let user1 = User { data: &data1 };
    let user2 = User { data: &data2 };
    let mut msg = SimpleMessage::new_msg(&user1, "test");
    msg.set_user(&user2);
}

Playground


如果要保存在运行时创建的字符串(例如,使用format!()调用),您可能希望存储String

pub struct SimpleMessage<'a> {
    pub user: &'a User<'a>,
    pub content: String,
}

. . . 

fn new_msg(user: &'a User, content: String) -> SimpleMessage<'a> {
    SimpleMessage { user, content }
}

. . . 

let mut msg = SimpleMessage::new_msg(&user1, format!("created at {}", "runtime"));

Playground

© www.soinside.com 2019 - 2024. All rights reserved.