Rust 双重参考值

Rust Double Reference Value

在 blurz 蓝牙库中寻找 Rust。

声明了一个变量,其值等于临时值的引用(?)。

然后这个值通过引用传递给另一个函数。

如何在单个语句中处理设置为引用值的变量的所有权,然后将该引用用作引用意味着什么?

示例:

let bt_session = &Session::create_session(None)?;
let adapter: Adapter = Adapter::init(bt_session)?;
adapter.set_powered(true)?;

let session = DiscoverySession::create_session(
    &bt_session,
    adapter.get_id()
)?;

参见变量 bt_session

Source code example link.

说明一些概念的注释示例:

use rand;

#[derive(Debug)]
struct Struct {
    id: i32
}

impl Drop for Struct {
    fn drop(&mut self) {
        // print when struct is dropped
        println!("dropped {:?}", self);
    }
}

fn rand_struct() -> Struct {
    Struct { id: rand::random() }
}

/*
this does not compile:

fn rand_struct_ref<'a>() -> &'a Struct {
    &rand_struct()
    // struct dropped here so we can't return it to caller's scope
}
*/

fn takes_struct_ref(s: &Struct) {}

fn main() {
    // brings struct into scope and immediately creates ref to it
    // this is okay because the struct is not dropped until end of this scope
    let s = &rand_struct();
    
    println!("holding ref to {:?}", s);
    
    // all these work because of deref coercion
    takes_struct_ref(s);
    takes_struct_ref(&s);
    takes_struct_ref(&&s);
    
    // struct dropped here
}

playground

回答你的第一个问题:如果在函数末尾删除基础值,你不能 return 来自函数的引用,但可以立即引用 returned 值,因为该值存在于调用者范围的其余部分。如果您 运行 上面的示例,您可以看到实际效果,因为 holding ref to Struct { id: <id> } 将在 dropped Struct { id: <id> }.

之前打印

回答你的第二个问题:你可以传递 &Struct&&Struct&&&Struct 等只需要 &Struct 的函数的原因这是因为 Rust 语法糖特性称为 deref 强制 ,当变量用作函数参数或方法调用的一部分时,它会自动取消引用变量。在您的共享代码示例中 它看起来像 一个 ref 的一个 ref 被传递给函数 但实际上 它只是在 auto deref 之后传递一个 ref强制发生。

另见