我应该如何理解&**self in Box

2023-11-25

boxed.rs 中的代码:

#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_box", issue = "92521")]
impl<T: ?Sized, A: Allocator> const Deref for Box<T, A> {
    type Target = T;

    fn deref(&self) -> &T {
        &**self
    }
}

以我的理解:

  • self -> &Box,
  • *self -> Box.
  • **self -> *Box, 将会通知:*(Box.deref())?这不会导致递归吗?

我创建一个测试代码:

impl<T> Deref for MyBox<T> {
    type Target = T;

    fn deref(&self) -> &T {
        &**self
    }
}

当我运行它时,Rust 返回给我:fatal runtime error: stack overflow

那么如何&**self在标准工作Box?


Box很特别。这是一个 lang 项目,并且编译器知道在没有帮助的情况下取消引用它。所以:

  • self - &Box.
  • *self - Box,共享引用的内置 deref。
  • **self - T, 内置取消引用Box.
  • &**self - &T.

所有内置操作都会发生类似的情况。例如,这是Add整数的 impl(在宏内部):

#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
impl const Add for $t {
    type Output = $t;

    #[inline]
    #[rustc_inherit_overflow_checks]
    fn add(self, other: $t) -> $t { self + other }
}

同样,编译器知道如何将整数相加。这是一个内置操作。

我们需要 impl 的原因是为了泛型。代码如下0i32 + 0i32转换为内置加法,但在通用函数中:

fn add<T: Add>(a: T, b: T) -> T::Output { a + b }

如果整数无法实现Add,这个函数不会接受它们。同样的情况也发生在Box and Deref.

您可以通过检查 MIR 看到这一点。例如,以下函数:

pub fn deref(b: &Box<i32>) -> &i32 {
    &**b
}

生成以下 MIR:

fn deref(_1: &Box<i32>) -> &i32 {
    let mut _0: &i32;
    bb0: {
        _0 = &(*(*_1));
        return;
    }
}

然而,以下功能:

pub fn deref<T: std::ops::Deref<Target = i32>>(b: &T) -> &i32 {
    &**b
}

生成以下 MIR,调用deref():

fn deref(_1: &T) -> &i32 {
    let mut _0: &i32;
    let _2: &i32;
    let mut _3: &T;
    bb0: {
        _3 = _1;
        _2 = <T as Deref>::deref(move _3) -> bb1;
    }
    bb1: {
        _0 = _2;
        return;
    }
}

其他的情况也一样Deref实施者,例如Rc:

pub fn deref(b: &std::rc::Rc<i32>) -> &i32 {
    &**b
}
fn deref(_1: &Rc<i32>) -> &i32 {
    let mut _0: &i32;
    let _2: &i32;
    let mut _3: &std::rc::Rc<i32>;
    bb0: {
        _3 = _1;
        _2 = <Rc<i32> as Deref>::deref(move _3) -> bb1;
    }
    bb1: {
        _0 = _2;
        return;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何理解&**self in Box 的相关文章

随机推荐

  • 如何使用 Python 单击 HTML 页面上的某些链接时打开 Windows 文件夹

    我正在编写以下程序 import os filepath r C TestData openfolder html abc open filepath w abc writelines abc writelines a href os st
  • 设置必须采用“名称=值”的形式。不知道该怎么办

    因此 我正在解析 Azure 存储帐户的连接字符串 当我到达使用连接字符串的应用程序页面时 编译器捕获一个异常 指出 设置必须采用 名称 值 的形式 这是否意味着我应该更正设置 appSettings 的 app config 文件中的某些
  • Angular 2 令人惊叹的动画

    Angular 2 RC2 刚刚问世 我想知道它是否已经支持交错动画 ngFor DSL语言文档提到group and sequence但没有任何形式的摇晃 RC2中不包含交错动画吗 我不确定我是否同意 G nter 的观点 即 ng co
  • 如何修复“模块‘tensorflow’没有属性‘估计器’”错误

    我正在使用 conda 通过 YAML 创建的 env pip 在我的 Linux Mint 盒子上设置 Tensorflow v1 13 1 环境 设置后 每当我尝试导入时tf estimator我收到AttributeError标题中描
  • 如何将 tweepy Twitter 流保存到文件中?

    我有一个工作脚本 可以成功收集提到 stackoverflow 的推文 但是 我想在 iPython 中运行该脚本 而不是执行单独的 py 文件 理想情况下 我只想打开它的 ipyb 文件 选择全部运行 然后让它运行一周左右 当然不要关闭我
  • 如何避免 cmd.exe 弹出命令窗口

    我有一个命令 cmd exe c ping 1 1 1 1 n 1 w 10000 echo second command goes here 但执行时它会打开一个命令窗口 有没有办法避免弹出命令窗口 PS 我无法从那里删除 cmd exe
  • 使用 Fetch API 读取分块的二进制响应

    如何使用 Fetch API 读取二进制分块响应 我正在使用以下代码 该代码可以从服务器读取分块响应 然而 数据似乎以某种方式编码 解码 导致getFloat32有时会失败 我尝试使用curl 读取响应 效果很好 这让我相信我需要做一些事情
  • 在 constrOptim 中设置约束

    有没有一种简单的方法可以在 constrOptim 函数中为以下约束设置 theta ui ci c1
  • 如何使用 Eloquent 对分组结果进行排序?

    我已经尝试解决这个问题有一段时间了 但似乎无法使其发挥作用 我有一张与此类似的桌子 表 问题 id yearly issue year stock created at updated at magazine id 1 10 2000 1
  • 如何使用 HTML 验证日期范围?

    或者 是否可以使用 HTML 验证另一个字段的值 一个常见的示例是选择一个日期范围 其中 起始 日期应小于或等于 截止 日期 如果您可以在语法中使用元素引用 则以下内容将描述值之间所需的关系
  • 更改 Velocity.Log 文件的位置

    看起来很简单 文档位于http velocity apache org engine devel developer guide html Configuring Logging说要设置runtime log属性 这是我所有财产的所得 ve
  • 获取android中用户的语言

    http web archiveorange com archive v fwvde0wN3xcViMtADw6x 似乎 navigator language 属性在 android 上的 webview 中始终为 en 那么 获取用户语言
  • 确定硬币组合的算法

    最近 我遇到了一个关于编程算法的提示 但我不知道该怎么做 我以前从未真正编写过算法 所以我在这方面还是个新手 该问题要求编写一个程序来确定收银员根据硬币价值和硬币数量找零的所有可能的硬币组合 例如 一种货币可能有 4 个硬币 2 分 6 分
  • 有没有办法获取当前函数的函数名?

    defun foo send to debug log Error Function terminated get current function name 我目前这样做 defun foo send to debug log Error
  • 当购物车达到一定数量时添加促销产品

    我正在 WooCommerce 中寻找正确的钩子 因为当达到一定的购物车数量 例如 100 个常规单位 时 我需要将促销产品添加到购物车 我也用过钩子 init 但我认为这是不对的 这是我的代码 function add free prod
  • OpenCV for Android:无法加载级联分类器错误

    这是我第一次使用 openCV 库 我想用它来检测眼睛 我已经用过FdActivity本教程中提供的代码 http romanhosek cz android eye detection updated for opencv 2 4 6 本
  • 使用 Perl 匹配两个重叠模式

    我希望我的问题还没有被其他人提出 因为我试图查看网站上的几乎所有地方 但我无法找到答案 我的问题是 我正在制作一个 PERL 脚本 它必须检测每一次出现 of one or字符串中的另一个模式 例如 string betaalphabeta
  • 从 C# 类生成 UML 图

    我有 nHibernate 生成的类 用作持久保存到 SQL 数据库的 MVC 项目的 BO 我想将现有代码呈现为 UML 图表 以便我可以开始使用代码生成实用程序 与所问的类似here仅适用于 SQL nhibernate SO 建议从
  • 如何在 javascript 中对 url 进行编码并在 C# 中对其进行解码

    我有一个带有查询字符串的网址 通过它传递一些数据 我想在服务器端检索数据 这个问题的解决办法是什么 您可以使用 javascript 的转义函数对 URL 进行编码 Example escape It s me result It 27s
  • 我应该如何理解&**self in Box

    boxed rs 中的代码 stable feature rust1 since 1 0 0 rustc const unstable feature const box issue 92521 impl