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
    首先,Azst,但是&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
    同时rcclone只是增加了引用计数,还是rc,打印1

答案

111011

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!