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
。
说明一些概念的注释示例:
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
}
回答你的第一个问题:如果在函数末尾删除基础值,你不能 return 来自函数的引用,但可以立即引用 returned 值,因为该值存在于调用者范围的其余部分。如果您 运行 上面的示例,您可以看到实际效果,因为 holding ref to Struct { id: <id> }
将在 dropped Struct { id: <id> }
.
之前打印
回答你的第二个问题:你可以传递 &Struct
或 &&Struct
或 &&&Struct
等只需要 &Struct
的函数的原因这是因为 Rust 语法糖特性称为 deref 强制 ,当变量用作函数参数或方法调用的一部分时,它会自动取消引用变量。在您的共享代码示例中 它看起来像 一个 ref 的一个 ref 被传递给函数 但实际上 它只是在 auto deref 之后传递一个 ref强制发生。
另见
在 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
。
说明一些概念的注释示例:
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
}
回答你的第一个问题:如果在函数末尾删除基础值,你不能 return 来自函数的引用,但可以立即引用 returned 值,因为该值存在于调用者范围的其余部分。如果您 运行 上面的示例,您可以看到实际效果,因为 holding ref to Struct { id: <id> }
将在 dropped Struct { id: <id> }
.
回答你的第二个问题:你可以传递 &Struct
或 &&Struct
或 &&&Struct
等只需要 &Struct
的函数的原因这是因为 Rust 语法糖特性称为 deref 强制 ,当变量用作函数参数或方法调用的一部分时,它会自动取消引用变量。在您的共享代码示例中 它看起来像 一个 ref 的一个 ref 被传递给函数 但实际上 它只是在 auto deref 之后传递一个 ref强制发生。
另见