“dyn”在类型中意味着什么?

2024-01-23

我最近看到代码使用dyn关键词:

fn foo(arg: &dyn Display) {}

fn bar() -> Box<dyn Display> {}

这个语法是什么意思?


TL;DR:这是一种用于指定 a 类型的语法特质对象并且为了清晰起见必须指定。


自 Rust 1.0 以来,trait 就开始了双重生活。一旦声明了特征,它就可以用作特征或类型:

// As a trait
impl MyTrait for SomeType {}

// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}

正如您可以想象的那样,这种双重含义可能会引起一些混乱。此外,由于MyTraittype 是一种未调整大小/动态调整大小的类型,这可能会让人们看到非常复杂的错误消息。

为了改善这个问题,RFC 2113 https://github.com/rust-lang/rfcs/blob/master/text/2113-dyn-trait-syntax.md介绍了dyn句法。此语法从 Rust 1.27 开始可用:

use std::{fmt::Display, sync::Arc};

fn main() {
    let display_ref: &dyn Display = &42;
    let display_box: Box<dyn Display> = Box::new(42);
    let display_arc: Arc<dyn Display> = Arc::new(42);
}

这个新关键字与impl Trait语法并努力使 a 的类型特质对象 https://stackoverflow.com/q/27567849/155423与“裸”特征语法更明显不同。

dyn是“动态”的缩写,指的是特征对象执行的事实动态调度 https://en.wikipedia.org/wiki/Dynamic_dispatch。这意味着确切调用哪个函数的决定将在程序运行时发生。将此对比静态调度 https://en.wikipedia.org/wiki/Static_dispatch它使用impl Trait syntax.

语法不带dyn现已弃用并且已在 2021 版中删除 https://doc.rust-lang.org/edition-guide/rust-2021/warnings-promoted-to-error.html#bare_trait_objects.

  • 为什么我要在特征上实现方法而不是作为特征的一部分? https://stackoverflow.com/q/34438755/155423
  • 是什么让某物成为“特质对象”? https://stackoverflow.com/q/27567849/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“dyn”在类型中意味着什么? 的相关文章

随机推荐

  • 非灵活环境应用程序的自定义运行时?

    我不认为我的 gae python 应用程序具有灵活的环境 因为我多年前创建了它 现在我想尝试创建一个具有不同于 python 的运行时的模块 并使 python 应用程序与新的运行时 自定义运行时或其他运行时一起运行 也许混合 PHP 和
  • 将 IQueryable 类型转换为 Linq to Entities 中的接口

    我的泛型类中有以下方法 This is the class declaration public abstract class BaseService
  • Google Cloud 端点和 JWT

    我有一个基于 Google Cloud Endpoints 的 API 我想使用 JWT Json Web Tokens 进行授权 我可以为每个包含令牌的请求设置授权标头 并且它可以正常工作 我知道 Endpoints 使用此标头进行 Oa
  • MaterialComponents.TextInputLayout.OutlinedBox 它无法正常工作 boxBackgroundColor

    我用的是材料 我将使用 TextInputLayout 的颜色作为背景 但类似于下面的颜色 提示背景未更改 我使用了样式并想进行更改 但没有成功 在布局本身中 我尝试再次应用更改 如何解决这个问题 NOTE 的背景标签用户名图片中没有透明的
  • 访问故事板内的视图

    如何在代码中访问从对象浏览器拖到情节提要中的另一个视图中的视图 例如 我创建了一个 UIView 并将其分配给 ViewController 类 然后我将地图视图拖到该视图中 现在我需要开始在代码中操作该地图视图 我如何访问它 我尝试过 s
  • UWP 模板 10 和服务依赖注入 (MVVM),而非 WPF

    我花了两个多星期的时间搜索 google bing stackoverflow 和 msdn 文档 试图找出如何为我正在开发的移动应用程序进行正确的依赖项注入 需要明确的是 我每天都在网络应用程序中进行 DI 我不需要关于什么 谁以及为什么
  • 使用安全模式=“TransportWithMessageCredential”测试WCF服务wsHttpBinding

    我尝试使用soapUI进行测试 但是在启用安全性时它不支持wsHttpBinding 使用 wsHttpBinding 时 soapUI 确实可以工作 但安全性为零 我们还尝试了 WCF Storm 它确实有效 我们可以加载我们的客户端配置
  • 跨节点项目共享通用打字稿代码

    假设我有以下项目结构 webapps ProjectA SomeClass ts 包 json ProjectB SomeClass ts 包 json Common LoggingClass ts 包 json 公共 LoggingCla
  • 如何在 Visual Studio (2010) 中突出显示 C(而不是 C++)语法?

    我正在和朋友一起用 C 语言做一些小练习 出于习惯 我一直使用较新语言的关键字 例如 bool new 我花了一段时间才意识到这是问题所在 因为 VS 不断将它们突出显示为关键字 即使它们不在 C 中 我确保所有文件都是 c 并将项目属性设
  • C# 中的队列和等待句柄

    我的应用程序中使用以下代码已有多年 但从未发现其中出现问题 while PendingOrders Count gt 0 WaitHandle WaitAny CommandEventArr 1 lock PendingOrders if
  • jquery .click 被多次调用

    我在 jQuery 尝试设置 div 的 click 方法时得到了意想不到的结果 请参见这个jsfiddle http jsfiddle net fkMf9 请务必打开控制台窗口 单击该单词几次并观察控制台输出 click 函数在只应调用一
  • PHP 计数函数与关联数组

    有人可以向我解释一下 count 函数如何处理如下所示的数组吗 我的想法是下面的代码输出 4 因为那里有 4 个元素 a array 1 gt A 1 gt B C 2 gt D echo count a count完全按照您的预期工作 例
  • Android:在 Android Place Api 中提供自动自动建议吗?

    我对 Android Google 地图非常陌生 我编写了以下程序 用于在 Android 中显示自动建议 当我在 自动完成 文本框中键入文本时 它将输入到 url 但输出未显示在程序中 请看一次并让我知道我在哪里犯了错误 ExampleA
  • Matlab非线性灰盒系统辨识

    我正在尝试进行非线性灰盒模型识别 并且我正在使用以下代码 我对输入向量 输出向量和时间戳中的输入进行了测量 input output data 2 3 output output data 4 5 time output data 1 da
  • Clojure 中是否有替代 nil 双关语的惯用方法?

    我目前正在阅读一些 Clojure 代码 其中有一堆未初始化的值 nil用于传递记录中的数值 现在有很多 Clo jure 库将其视为惯用语 https stackoverflow com questions 6045404 why clo
  • SQL Server 2008 Express 无法用于合并复制?

    根据 Microsoft 的说法 SQL Server 2008 Express 应该能够作为拉取订阅者参与合并复制 至少对于 RMO 对象来说是这样 http msdn microsoft com en us library ms1478
  • 错误 800A01A8 需要对象

    我有一个 VBScript 代码 它给我一个错误 提示 需要对象 错误 800A01A8 位于第 11 行和第 3 个字符 这是代码 Dim strWebsite strWebsite 78 72 111 138 80 If PingSit
  • EF CTP4:“创建模型时无法使用上下文。”

    我有两个实体 学生和班级 他们之间有多对多的关系 class Student ICollection
  • 通过中断中间单词强制 Jasper HTML 报告换行

    我在 Jaspersoft Studio 中创建了一个 Jasper 报告 用于生成 HTML 报告 它的宽度为 550px 其中一个数据字段包含 URL 其中一些可能非常长 例如 我遇到的问题是生成的报告不会破坏 URL 中间单词 即查询
  • “dyn”在类型中意味着什么?

    我最近看到代码使用dyn关键词 fn foo arg dyn Display fn bar gt Box