gpt4 book ai didi

rust 从匹配表达式右侧的字符串中创建一个 b"string"

转载 作者:行者123 更新时间:2023-11-29 08:08:09 25 4
gpt4 key购买 nike

我正在尝试以下操作:

enum Payload {
Text(String)
}

struct Message {
payload: Payload
}

impl Message {
fn snd (self) {

let my_msg = match self.payload {
Payload::Text(s) => s.into_bytes().as_slice() // error here!
};
println!("silly example: {}", my_msg);
}
}

fn main () {
let str = "hi".to_string();
let pyld = Payload::Text(str);
let msg = Message{payload: pyld};
msg.snd();
}

但是当我这样做时,出现以下错误:

<anon>:13:33: 13:47 error: borrowed value does not live long enough
<anon>:13 Payload::Text(s) => s.into_bytes().as_slice()

我的问题:有没有办法在 match 语句中而不是在 println! 语句中给出切片值?

你可以找到这支笔here

最佳答案

.into_bytes()消耗 s并产生 Vec<u8> .它没有存储在任何地方,因此会立即超出范围。

您已调用 .as_slice()在那上面,产生&[u8] ,对该对象的引用。但是,如前所述,它会立即超出范围,因此“借用的值(value)不会存在足够长的时间”。

解决方案是不消耗其中任何一个的有效负载,而是一路获取引用:

let my_msg = match self.payload {
Payload::Text(ref s) => s.as_bytes(),
};

ref s而不是 s意味着它引用了 String ( s 的类型是 &String 而不是 String ),然后我们使用 as_bytes(&self) -> &[u8]而不是 into_bytes(self) -> Vec<u8> .

关于rust 从匹配表达式右侧的字符串中创建一个 b"string",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com