📅  最后修改于: 2021-01-08 13:58:24             🧑  作者: Mango
常规引用是一种指向存储在其他位置的值的指针。让我们看一个创建i32类型值的引用的简单示例,然后将dereference运算符与此引用一起使用。
fn main()
{
let a = 20;
let b = &a;
if a==*b
{
println!("a and *b are equal");
}
else
{
println!("they are not equal");
}
}
输出:
a and *b are equal
在上面的示例中,a保留i32类型值,20,而b包含对“ a”变量的引用。如果使用* b,则它表示值20。因此,我们可以比较变量a和* b,它将返回真实值。如果我们使用&b而不是* b,则编译器将引发错误“无法将{integer}与{&integer}进行比较” 。
Box
让我们看一个简单的例子:
fn main()
{
let a = 11;
let b = Box::new(a);
print!("Value of *b is {}",*b);
}
输出:
Value of *b is 11
在上面的示例中,Box
现在,我们创建类似于Box
让我们看一个简单的例子:
struct MyBox(T);
impl MyBox
{
fn example(y : T)->MyBox
{
MyBox(y)
}
}
fn main()
{
let a = 8;
let b = MyBox::example(a);
print!("Value of *b is {}",*b);
}
输出:
在上面的示例中,我们创建了智能指针b,但无法对其取消引用。因此,我们得出结论,不能取消引用类似于Box
让我们看一个简单的例子:
struct MyBox
{
a : T,
}
use :: std::ops::Deref;
impl Deref for MyBox
{
type Target = T;
fn deref(&self) ->&T
{
&self.a
}
}
fn main()
{
let b = MyBox{a : 10};
print!("{}",*(b.deref()));
}
输出:
10
让我们看一个简单的例子:
struct MyBox(T);
use :: std::ops::Deref;
impl MyBox
{
fn hello(x:T)->MyBox
{
MyBox(x)
}
}
impl Deref for MyBox
{
type Target = T;
fn deref(&self) ->&T
{
&self.0
}
}
fn print(m : &i32)
{
print!("{}",m);
}
fn main()
{
let b = MyBox::hello(5);
print(&b);
}
输出:
5
在上面的示例中,我们使用参数&b调用print(&b)函数,该参数是&Box
到目前为止,我们使用Deref Trait覆盖不可变引用上的*运算符,并且可以使用DerefMut特质覆盖可变引用上的*运算符。
Rust在以下三种情况下执行Deref强制:
注意:Rust可以将可变引用强制为不可变引用,但是由于借用规则,它不能将可变引用强制为可变引用。