只是从我在Rust中的冒险开始,并试图找出创建和返回枚举的正确方法,该枚举应该拥有通过传递给方法的String创建的&str字符串切片的所有权。我认为生命周期注释本身并不能解决问题,因为无论如何,原始字符串参数将超出功能块末尾的范围。任何帮助将不胜感激。
test
我当前遇到的编译器错误只是枚举定义需要生命周期参数。
答案 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())
}
}