目前感觉 &是写在右式,ref是写在坐式
let x = 5;
let y = &x;
let ref z = x;
fn main() {
let mut s = String::from("hello");
change(&mut s);
}
fn change(some_string: &mut String) {
some_string.push_str(", world");
}
想把上面的程序改成使用 ref
我就想着 some_string是一个引用类型
使用 ref some_string ,然后他已经定义成引用了,后面&mut String就直接使用String的类型就可以了
然后change(&mut s)就直接是change(s)
fn main() {
let mut s = String::from("hello");
change(s);
println!("{}",s);//这里去打印一下
}
fn change(ref mut some_string: String) {
some_string.push_str(", world");
}
但有个问题,就是怎么发生所有权转移了呢? 这里不应该是借用吗? some_string不是ref吗?
1
共 5 条评论, 1 页
评论区
写评论ref应该主要作用的是值let x = 100;let ref y = x 等于 let y = &x也就是借用100这个值。&除了作用于值外,还是主要用于类型,如:&str,&String,&T,.....函数传参主要是看的
类型,你的例子中的类型是String,不是&String所以是转移不是借用个人理解。
ref与&有区别的,功能并不完全一样,不是简单的写法不同,该用哪个就得用哪个,只是在部分情况下效果一样, 在模式匹配中ref与&就是不同的含义,模式匹配也是ref的主要使用场景 , 官方文档也有ref的解释和& vs ref,
我看你还改了mut
fn foo(mut f: Foo)与fn foo(f: &mut Foo)也是不同的含义但是不能change(&s) 这样会报错,要的是String,传入的是&String
--
👇
bestgopher: change(s);你传入的是s,就说明了所有权转移了
我的理解是,
change的第一个参数的类型还是String,所以你使用change的时候还是要传String,但是some_string这个“名字”绑定到了传入的这个String的地址,let ref x = y的时候也是x这个名字绑定到了y的地址。