在函数参数中,使用ref关键字和使用&符号有什么区别?

iDu*_*Jie 5 rust

在此代码,sref1并且sref2是的地址s,和地址是相同的.ref和之间有什么区别&

fn main() {
    let s = String::from("hello");
    let sref1 = &s;
    let ref sref2 = s;
    println!("{:p}", sref1);
    println!("{:p}", sref2);

    f1(&s);
    f2(s);
}

fn f1(_s: &String) {
    println!("{:p}", _s);
}

fn f2(ref _s: String) {
    println!("{:p}", _s);
}
Run Code Online (Sandbox Code Playgroud)

_sin f1f2也是字符串的地址,f2将取得所有权,但打印f2的地址与打印的地址不同f1.为什么?

Web*_*rix 6

在模式中,&解构借用,ref通过引用而不是通过值绑定到位置。

换句话说,&让你通过借来到达,并ref说“借到我匹配的东西内的这个地方”

&并且ref是对立的。

#![feature(core_intrinsics)]

fn main() {
    let x = &false;
    print_type_name_of(x);

    let &x = &false;
    print_type_name_of(x);

    let ref x = &false;
    print_type_name_of(x);
}

fn print_type_name_of<T>(_: T) {
    println!("{}", unsafe { std::intrinsics::type_name::<T>() })
}
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

&bool
bool
&&bool
Run Code Online (Sandbox Code Playgroud)