为什么我不能使用 let _: Arc = value.into() 创建特征对象?

2023-12-05

use std::sync::Arc;

trait Trait {}
struct TraitImpl {}
impl Trait for TraitImpl {}

fn main() {
    let value = TraitImpl {};
    let _: Arc<dyn Trait> = Arc::new(value);    // compiles
    let _: Arc<dyn Trait> = value.into();       // doesn't compile
}

Result

error[E0277]: the trait bound `std::sync::Arc<dyn Trait>: std::convert::From<TraitImpl>` is not satisfied
  --> src/main.rs:10:35
   |
10 |     let _: Arc<dyn Trait> = value.into();       // doesn't compile
   |                                   ^^^^ the trait `std::convert::From<TraitImpl>` is not implemented for `std::sync::Arc<dyn Trait>`
   |
   = help: the following implementations were found:
             <std::sync::Arc<T> as std::convert::From<T>>
             <std::sync::Arc<T> as std::convert::From<std::boxed::Box<T>>>
             <std::sync::Arc<[T]> as std::convert::From<&[T]>>
             <std::sync::Arc<[T]> as std::convert::From<std::vec::Vec<T>>>
           and 8 others
   = note: required because of the requirements on the impl of `std::convert::Into<std::sync::Arc<dyn Trait>>` for `TraitImpl`

(操场)

为什么Arc::new(value)编译但不编译value.into()?我不明白为什么Arc<T>::new()很满意,同时From<T>::from isn't.

impl<T> Arc<T> {
    pub fn new(data: T) -> Arc<T>
}
impl<T> From<T> for Arc<T> {
    fn from(t: T) -> Arc<T>
}

你的两条线有根本的区别。第一个:

let _: Arc<dyn Trait> = Arc::new(value);

模式对于分辨率并不重要Arc::new(),因为它的定义如您所指出的:

impl<T> Arc<T> {
    pub fn new(data: T) -> Arc<T>
}

所以类型T是从类型推导出来的value那是TraitImpl, 和Arc<TraitImpl>被建造。 那么这个类型是隐式的未调整大小的强制对此Arc<dyn Trait>一切都编译得很好。


但第二行是骗人的:

let _: Arc<dyn Trait> = value.into();

由于没有into函数于TraitImpl编译器搜索范围内的任何特征并找到Into<T>::into(),定义为:

pub trait Into<T> {
    fn into(self) -> T;
}

现在编译器想知道那是什么类型T是。由于它是函数的返回,因此它猜测T is Arc<dyn Trait>。现在唯一有趣的实现Into是在From:

impl<X, T> Into<T> for X where
    T: From<X>

Here X is TraitImpl and T is Arc<dyn Trait>。如果你看一下的含义Arc for From,其中包括很多,但没有一个适用。这是最相似的:

impl<T> From<T> for Arc<T>

然后,编译器会显示一些失败的候选者并发出错误。


The TL;DR;是你实际上想要进行两次转换:TraitImpl to Arc<TraitImpl>然后从Arc<TraitImpl> to Arc<dyn Trait>。但是您不能在一次强制转换中同时执行这两项操作,编译器必须以某种方式拼写出中间类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能使用 let _: Arc = value.into() 创建特征对象? 的相关文章

随机推荐

  • Android 共享首选项和数组

    我创建了一个天气小部件 我将其配置存储在SharedPreferences 小部件由服务更新 我将天气信息和天气预报一起保存在一个数组中 晚上手机关机后 我发现数组值消失了 也许系统暂停了 服务 有没有办法将数组存储在SharePrefer
  • 如何使用 NSPredicate 判断 Int 列表是否包含 Int 数字?

    我有一个 Realm 模型Person谁拥有标签属性 let tags List
  • C 编程中的输入重定向?

    我试图将一个名为 data1 的数据文件重定向到我的程序中 但我不断收到segmentation fault 当我尝试时 w data1然后它会正确读取它 但是当我这样做时 w lt data1然后弹出错误 我必须使用第二种方式来完成我的作
  • 将 java.util.Date 转换为 java.sql.Timestamp 结果为错误值

    服务器端代码 服务器时区是 UTC Date aDate new Date java sql Timestamp aTimestamp new java sql Timestamp aDate getTime 客户端 移动应用程序 时区 G
  • IIS 7.5 无法使用代码隐藏文件加载自定义 HTTP 处理程序

    在过去的 2 天里 我试图让我的自定义 HTTP 处理程序正常工作 但没有结果 我收到以下错误 无法加载类型 AlarmHandler 描述 未处理 执行当前 Web 请求期间发生异常 请查看堆栈跟踪以获取有关错误和的更多信息 它起源于代码
  • 如何为 php 启用 mysqlnd?

    我安装并运行了 PHP 版本 5 3 17 我想切换到 mysqlnd 在 phpinfo 中 mysqlnd 根本不存在 我读到为了设置它 您需要更新 configure命令 configure with mysql mysqlnd wi
  • 更改焦点上组合框的边框颜色

    我有一个习惯ComboBox 我想给一个定制BorderColor to the ComboBox 当它聚焦时 为此 我使用以下代码 Graphics g Graphics FromHwnd Handle Rectangle bounds
  • 在 C++ 中,从函数返回向量仍然是不好的做法吗?

    简洁版本 在许多编程语言中 返回大型对象 例如向量 数组 是很常见的 如果类有移动构造函数 这种风格现在在 C 0x 中是否可以接受 或者 C 程序员是否认为它很奇怪 丑陋 令人厌恶 长版 在 C 0x 中 这仍然被认为是不好的形式吗 st
  • 为什么电子邮件客户端需要 SMTP 中继服务器?有必要吗?

    在设置我的移动电子邮件客户端时 我通常需要输入 SMTP 中继服务器域名 但为什么我的电子邮件客户端需要 SMTP 中继服务器呢 我认为它可以通过查找 DNS MX 记录 直接与目标电子邮件地址所在域的 smtpd 服务器 例如 postf
  • 在 MySQL 数据库的每个表的字段中搜索文本

    我想在 MySQL 数据库的所有表的所有字段中搜索给定的字符串 可能使用以下语法 SELECT FROM WHERE LIKE stuff 可以做这样的事情吗 你可以做一个SQLDump数据库 及其数据 的名称 然后搜索该文件
  • Python 中释放内存

    我有一些关于以下示例中内存使用情况的相关问题 如果我在解释器中运行 foo bar for in xrange 10000000 我的机器上使用的实际内存达到80 9mb 然后我 del foo 真实记忆力下降 但仅限于30 4mb 解释器
  • Atmel SAM3X8E 双组切换用于启动不同的行为

    我目前正在使用 Arduino Due 板 该板嵌入了 Atmel SAM3X8E 处理器 我使用 Atmel Studio 版本 7 0 1645 和提供的 Atmel 软件框架 版本 3 28 1 对其进行编程 在 SAM 上运行的程序
  • Google 地图不会从我的网站加载 KML 图层

    我有一个包含 kml 的网站 KML 在 Google 地图中显示为图层 这些地图位于同一站点 直到最近 5 月 12 日 这还运行得很好 但现在它不再工作了 kml本身没问题 可以在Google Earth中使用 当我将 kml 复制到另
  • CSS 2,使用链接元素导入的样式表的优先级

    Given 哪些规则在级联中具有更高的优先级 假设所有 CSS 比较都具有相同的优先级 那些在第一个或最后一个样式表中 戴夫 蒂亚 根据规格 应用最新的 4 Finally sor
  • JS 调用堆栈总是至少有一帧吗?

    我最近看到一个JS 事件循环的演示坦率地说 这非常出色 但我现在有一个关于 JS 调用堆栈的挥之不去的问题 如果您将全局执行上下文视为 main 那么 main 是否永远不会解析 我的推理是 如果是的话 那么 JS 程序就会完成 并且不会发
  • 使用SOLR计算两个ulong之间的“相似度”/“位数”

    我们有一个图像数据库 我使用它计算了 PHASHNeal Krawetz 博士的方法由执行大卫 奥夫泰达尔 计算这些 long 之间的差异的部分示例代码如下 ulong hash1 AverageHash theImage ulong ha
  • 识别列表列表中具有 3 个共同元素的列表

    我有一个清单 如果存在前三个元素相同的子列表 请将它们合并到一个列表中并添加所有第四个元素 该问题最好用代码和所需的输出来解释 a list apple 50 60 7 orange 70 50 8 apple 50 60 12 outpu
  • 如何从包含可点击项目的 ListView 中获取行的行 ID?

    在我向行的布局 XML 添加按钮之前 单击列表项时会在回调 onListItemClick 中返回行 ID 现在我向列表行布局添加了一个按钮 此回调不再起作用 我读到这是正常的 我已经能够通过在列表行的布局 XML 文件中包含此类内容来获取
  • 如何在 Django Admin 中更改站点标题、站点标题和索引标题?

    如何更改网站标题Django site admin 网站标题Django administration和索引标题Site administration在 Django 管理中 从 Django 1 7 开始 您不需要覆盖模板 您现在可以实施
  • 为什么我不能使用 let _: Arc = value.into() 创建特征对象?

    use std sync Arc trait Trait struct TraitImpl impl Trait for TraitImpl fn main let value TraitImpl let Arc