我是Rust的新手,正在努力理解Reference是如何工作的.下面是一个简单的函数.
fn f1(x: &i32) -> &i32{
x
}
因为x
是&i32
类型,所以返回它直接与返回类型&i32
匹配.但我发现,如果我将函数更改为以下内容,它也可以毫无问题地进行编译:
fn f1(x: &i32) -> &i32{
&x
}
这里x
是类型&i32
,&x
是类型&&i32
,与返回类型&i32
不匹配.它为什么会编译?
我是Rust的新手,正在努力理解Reference是如何工作的.下面是一个简单的函数.
fn f1(x: &i32) -> &i32{
x
}
因为x
是&i32
类型,所以返回它直接与返回类型&i32
匹配.但我发现,如果我将函数更改为以下内容,它也可以毫无问题地进行编译:
fn f1(x: &i32) -> &i32{
&x
}
这里x
是类型&i32
,&x
是类型&&i32
,与返回类型&i32
不匹配.它为什么会编译?
这是type coercion的结果.
为了使语言更符合人体工程学,在特定情况下允许使用certain set of coercions.其中一种情况是确定函数的返回值.
在允许的强制措施中,有以下几种:
&;T或&;mut T到&;U,如果T实现了Deref<;Target=U>;
在本例中,STD文库中有一个implementation of the deref的特征:
impl<T: ?Sized> const Deref for &T {
type Target = T;
#[rustc_diagnostic_item = "noop_method_deref"]
fn deref(&self) -> &T {
*self
}
}
在您的例子中,目标T
是i32
,特征是为&T
实现的(即.&&i32
),因此可以将该值从&&i32
强制为&i32
.