我的程序初始化变量“mag”,然后将其传递给根据int修改它的函数。
let n = some_number;
let m = "";
x = foo(n, m);
fn foo(n: u64, mut m: &str) -> &str {
if n == 0 {
m = "asdf";
} else {
m = "qwerty";
return mag;
}
但是我得到一个编译器警告,从未读过mag。我无法返回在函数内创建的变量,因此我必须在外部初始化mag。有没有更好的方法呢?
你不需要传递一个引用,你可以在函数外传递局部变量的所有权没问题。如果你绝对需要,String
s也会引用&str
:
fn main() -> std::io::Result<()> {
let n = 55;
let x = foo(n);
match &x[..] {
"querty" => println!("Yep it was qwerty!"),
_ => println!("Nope it wasn't qwerty :(")
};
Ok(())
}
fn foo(n: u64) -> String {
if n == 0 {
String::from("asdf")
} else {
String::from("querty")
}
}
打印“是的,它是qwerty!”。
根据您的评论编辑包含匹配。
在您的示例中,您将返回静态字符串,因此您可以这样做:
fn foo(n: u64) -> &'static str {
if n == 0 {
"asdf"
} else {
"querty"
}
}
你绝对可以做到这一点,但是你需要传递一个可变引用,也就是你无法改变&str
的内容(如果那是你想要做的事情; &str
在它自己是不可变的)。你只需要改变m
指向另一个&str
。这是无效的,因为"asdf"
和"qwerty"
是'static
str
s。
fn main() {
let mut m = "";
foo(42, &mut m);
dbg!(m);
foo(0, &mut m);
dbg!(m);
}
fn foo(n: u64, m: &mut &str) {
if n == 0 {
*m = "asdf";
} else {
*m = "qwerty";
}
}