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 協議》,轉載必須註明作者和本文連結