gpt4 book ai didi

rust - 我们如何在多个调用中保存和检索结构中的变量?

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

我们正在尝试将一个句子保存在一个结构中,需要事先对其进行初始化,否则在匹配语句中将不知道该结构(请参阅下面的代码 let data = ...) .

当我们调用该函数两次时(如 fn main 部分所示),它会用默认的初始化结构覆盖先前保存的句子并返回它。

有没有什么方法可以在不使用不安全的全局变量的情况下保存该句子并在“RET”的匹配语句中为人所知?

#[derive(Default)]
struct Test {
satz: String,
}

impl Test {
pub fn testing(message: &str) -> Result<Option<String>, &'static str> {
let mut vs: Vec<&str> = message.split(' ').collect();
let mut i = 0;
while vs[i] != "\n" {
i += 1;
if i > vs.len() {
Err("wrong format.").unwrap()
}
}
vs.truncate(i);
let data: Test = Default::default();
match vs[0] {
"PUB" => {
let data = Test { satz: vs.join(" ") };
Ok(None)
}
"RET" => {
let x = data.satz;
Ok(Some(x))
}
_ => Err("wrong format.")
}
}
}

fn main() {
Test::testing("PUBLISH Hey this is a short message! \n");
let a = Test::testing("RETRIEVE \n").unwrap().unwrap();
println!("{:?}", a);
}

最佳答案

the previously saved sentence

您似乎对数据的存储方式和存储位置感到很困惑。我强烈建议您重新阅读The Rust Programming Language .在这种特定情况下,您应该格外小心地重新阅读直到并包括 methods。 .

说白了,Test::testing 没有地方可以存储数据。访问每个实例数据的方法有一个 self 参数。 Test::testing 是一个关联函数,而不是一个方法。

&mut self添加到函数中使其成为一个方法,然后用self替换所有对data的使用:

#[derive(Default)]
struct Test {
satz: String,
}

impl Test {
pub fn testing(&mut self, message: &str) -> Result<Option<String>, &'static str> {
let mut vs: Vec<_> = message.split(' ').collect();
let mut i = 0;
while vs[i] != "\n" {
i += 1;
if i > vs.len() {
Err("wrong format.").unwrap()
}
}
vs.truncate(i);

match vs[0] {
"PUB" => {
self.satz = vs.join(" ");
Ok(None)
}
"RET" => {
Ok(Some(self.satz.clone()))
}
_ => Err("wrong format.")
}
}
}

fn main() {
let mut t = Test::default();
t.testing("PUB Hey this is a short message! \n").unwrap();
let a = t.testing("RET \n").unwrap().unwrap();
println!("{:?}", a);
}

请注意,编译器试图告诉您出了点问题:

warning: unused variable: `data`

您似乎认为 data 有一些特殊的含义,可以让它在函数调用中保持不变——实际上并没有这样的东西。跨函数持久化,而不明确数据的存储位置,成为一个全局变量,出于多种原因,这些都是不可取的。

此外,您不应该忽略警告,例如

warning: unused result which must be used

如果某些事情不能失败,调用expect(或者如果你必须,调用unwrap)。


FWIW,我会这样写

impl Test {
pub fn testing(&mut self, message: &str) -> Result<Option<String>, &'static str> {
let message = message.trim();
let mut parts = message.splitn(2, " ");

match parts.next() {
Some("PUB") => {
let msg = parts.next().ok_or("wrong format.")?;
self.satz = msg.to_owned();
Ok(None)
}
Some("RET") => {
Ok(Some(self.satz.clone()))
}
_ => Err("wrong format.")
}
}
}

关于rust - 我们如何在多个调用中保存和检索结构中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065938/

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