rust-quiz:030-clone-pointers.rs
题目
use std::rc::Rc;
struct A;
fn p<X>(x: X) {
match std::mem::size_of::<X>() {
0 => print!("0"),
_ => print!("1"),
}
}
fn main() {
let a = &A;
p(a);
p(a.clone());
let b = &();
p(b);
p(b.clone());
let c = Rc::new(());
p(Rc::clone(&c));
p(c.clone());
}
关键
zst
对于zst
类型,是不占用实际内存的。方法查找
T
->&T
->&mut T
题解
p
不难看出来,对于zst
打印0
,其他类型打印1
。a
首先,A
是zst
,但是&A
属于引用,不是zst
类型,打印1
。a.clone()
,A
本身没有实现Clone
,因此方法查找时就会找到&A
。
此时的&A
作为&T
#[stable(feature = "rust1", since = "1.0.0")] impl<T: ?Sized> Clone for &T { #[inline] #[rustc_diagnostic_item = "noop_method_clone"] fn clone(&self) -> Self { *self } }
已经实现了
clone
,类型不变,还是&A
,打印1
b
同样的,()
是zst
,但是&()
有大小,打印1
。
因为()
实现了Clone
,返回的当然是()
,因此().clone()
打印0
c
Rc
作为对象,本身肯定不是zst
,打印1
。
同时rc
的clone
只是增加了引用计数,还是rc
,打印1
答案
111011
本作品采用《CC 协议》,转载必须注明作者和本文链接