注释生命周期/确定方法中字符串所有权的正确方法?

时间:2019-12-08 22:27:48

标签: rust

只是从我在Rust中的冒险开始,并试图找出创建和返回枚举的正确方法,该枚举应该拥有通过传递给方法的String创建的&str字符串切片的所有权。我认为生命周期注释本身并不能解决问题,因为无论如何,原始字符串参数将超出功能块末尾的范围。任何帮助将不胜感激。

test

我当前遇到的编译器错误只是枚举定义需要生命周期参数。

1 个答案:

答案 0 :(得分:2)

正如其他人在评论中说的那样,最简单的方法是在各处使用String。话虽如此,如果您想避免多余的副本和分配,则可以将拥有该字符串的责任推向更高的呼叫链。如果要执行此操作,则需要更改函数签名,以使其借用msg而不是拥有所有权,并添加所需的生存期参数。像这样:

pub enum PubSubMessage<'a> {
    // For now I won't worry about subbing/unsubbing to an array of channels
    SUBSCRIBE { channel: &'a str },
    UNSUBSCRIBE { channel: &'a str },
    PUBLISH { channel: &'a str, msg: &'a str},
    PSUBSCRIBE { pattern: &'a str },
    PUNSUBSCRIBE { pattern: &'a str},
}

pub fn parse_message<'a> (msg: &'a str) -> Result<PubSubMessage<'a>, String> {
    let msg_contents: Vec<_> = msg.split(" ").collect();

    return match msg_contents.as_slice() {
        ["SUBSCRBE", channel] => Ok(PubSubMessage::SUBSCRIBE { channel }),
        ["UNSUBSCRIBE", channel] => Ok(PubSubMessage::UNSUBSCRIBE { channel }),
        ["PUBLISH", channel, msg] => Ok(PubSubMessage::PUBLISH { channel, msg }),
        _ => Err("Could not parse ws message.".to_string())
    }
}

Playground