< 返回版块

cybertheye 发表于 2024-03-06 14:48

Tags:引用

目前感觉 &是写在右式,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吗?

评论区

写评论
my 2024-05-28 22:03

ref 应该主要作用的是 let x = 100;let ref y = x 等于 let y = &x 也就是借用 100 这个值。

& 除了作用于 外,还是主要用于 类型,如:&str,&String,&T,.....

函数传参主要是看的 类型,你的例子中的类型是 String,不是&String 所以是 转移不是借用

个人理解。

Nickname 2024-03-07 15:28

ref与&有区别的,功能并不完全一样,不是简单的写法不同,该用哪个就得用哪个,只是在部分情况下效果一样, 在模式匹配中ref与&就是不同的含义,模式匹配也是ref的主要使用场景 , 官方文档也有ref的解释和& vs ref,

我看你还改了mut fn foo(mut f: Foo)fn foo(f: &mut Foo)也是不同的含义

作者 cybertheye 2024-03-06 17:03

但是不能change(&s) 这样会报错,要的是String,传入的是&String

--
👇
bestgopher: change(s);你传入的是s,就说明了所有权转移了

TinusgragLin 2024-03-06 16:58

我的理解是,change 的第一个参数的类型还是 String,所以你使用 change 的时候还是要传 String,但是 some_string 这个“名字”绑定到了传入的这个 String 的地址,let ref x = y 的时候也是 x 这个名字绑定到了 y 的地址。

bestgopher 2024-03-06 15:43
change(s);你传入的是s,就说明了所有权转移了
1 共 5 条评论, 1 页