我用Rust写了一个简单的程序.这个程序可以编译.
use std::cell::{Ref, RefCell};
fn print_number(x: &i32) {
println!("x is {}", x);
}
fn main() {
let stack: i32 = 42;
let reference: &i32 = &stack;
let refcell: RefCell<&i32> = RefCell::new(reference);
let wrapped: Ref<'_, &i32> = refcell.borrow();
print_number(&wrapped);
print_number(*wrapped);
}
我可以说出两者都有效的原因:
-
&
是有效的,因为&wrapped
是类型&Ref<&i32>
,可以被反胁迫为&&i32
,后者可以被反胁迫为&i32
. -
*
行,因为*wrapped
等于*Deref::deref(&wrapped)
.我们知道Deref::deref(&Ref<&i32>)
个结果对应&&i32
个结果,所以*Deref::deref(&Ref<&i32>)
个结果对应*&&i32
个结果,即&i32
个.
第二种方法(*
)似乎更直接,但是Rust编译器建议我使用第一种方法(&
).如果我添加一行:
print_number(wrapped);
这当然不能编译.但我对编译报告很感兴趣:
error[E0308]: mismatched types
--> src/main.rs:16:18
|
16 | print_number(wrapped);
| ------------ ^^^^^^^ expected `&i32`, found `Ref<'_, &i32>`
| |
| arguments to this function are incorrect
|
= note: expected reference `&i32`
found struct `Ref<'_, &i32>`
note: function defined here
--> src/main.rs:3:4
|
3 | fn print_number(x: &i32) {
| ^^^^^^^^^^^^ -------
help: consider borrowing here
|
16 | print_number(&wrapped);
| +
For more information about this error, try `rustc --explain E0308`.
error: could not compile `testrust` (bin "testrust") due to 1 previous error
在报告的"帮助"中,它建议我加&
.我想知道为什么它不建议我加*
分.