目前感觉 &是写在右式,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
的地址。