常规引用是一种指向存储在其他位置的值的指针。让我们看一个简单的示例,创建i32类型值的引用,然后对这个引用使用解引用运算符。
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则包含对'a'变量的引用。如果使用* b,则它表示值20。因此,我们可以比较变量a和* b,它将返回真实值。如果我们使用&b而不是* b,则编译器将引发错误“cannot compare {integer} with {&integer}”。
Box <T>指针可用作引用。让我们看看一个简单的例子:
fn main() { let a = 11; let b = Box::new(a); print!("Value of *b is {}",*b); }
输出:
Value of *b is 11
在上面的示例中,Box <T>的行为与常规引用相似。它们之间的唯一区别是b包含指向数据的框,而不是通过使用'&'运算符引用该值的框。
现在,我们创建类似于Box <T>类型的智能指针,我们将看到它们与常规引用的行为有所不同。
让我们看看一个简单的例子:
struct MyBox<T>(T); impl<T> MyBox<T> { fn example(y : T)->MyBox<T> { MyBox(y) } } fn main() { let a = 8; let b = MyBox::example(a); print!("Value of *b is {}",*b); }
输出:
在上面的示例中,我们创建了智能指针b,但是无法对其取消引用。因此,我们得出结论,不能取消引用与Box <T>类型相似的自定义指针。
让我们看看一个简单的例子:
struct MyBox<T> { a : T, } use ::std::ops::Deref; impl<T> Deref for MyBox<T> { type Target = T; fn deref(&self) ->&T { &self.a } } fn main() { let b = MyBox{a : 10}; print!("{}",*(b.deref())); }
输出:
10
让我们看看一个简单的例子:
struct MyBox<T>(T); use ::std::ops::Deref; impl<T> MyBox<T> { fn hello(x:T)->MyBox<T> { MyBox(x) } } impl<T> Deref for MyBox<T> { 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 <i32>的引用。在这种情况下,我们实现了Deref特性,该特性通过Deref Coercion的过程将&Box <i32>转换为&i32。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)