参数类型可能存在的时间不够长

2023-12-13

我有一个简单的程序,我试图实现多态帐户类型:

enum AccountType {
    INVALID,
    TYPE1,
    TYPE2,
}

trait Account {
    fn get_name(&self) -> String;
    fn get_type(&self) -> AccountType;
}

struct Accounts {
    accounts: Vec<Box<Account>>,
}

impl Accounts {
    fn new() -> Accounts {
        let accs: Vec<Box<Account>> = Vec::new();
        Accounts { accounts: accs }
    }

    fn add_account<A: Account>(&self, account: A) {
        self.accounts.push(Box::new(account));
    }
}

fn main() {
    let accounts = Accounts::new();
}

(铁锈游乐场)

当我编译它时,我看到以下错误:

error[E0310]: the parameter type `A` may not live long enough
  --> src/main.rs:23:28
   |
22 |     fn add_account<A: Account>(&self, account: A) {
   |                    -- help: consider adding an explicit lifetime bound `A: 'static`...
23 |         self.accounts.push(Box::new(account));
   |                            ^^^^^^^^^^^^^^^^^
   |
note: ...so that the type `A` will meet its required lifetime bounds
  --> src/main.rs:23:28
   |
23 |         self.accounts.push(Box::new(account));
   |                            ^^^^^^^^^^^^^^^^^

我尝试过向该类型添加生命周期,但找不到正确的方法。如果这不是在 Rust 中进行多态性的正确方法,请告诉我。


我将尝试给出更彻底的答案:这个问题与accounts成员Accounts. Vec<Box<Account>>在这种情况下相当于Vec<Box<Account + 'static>>,即该框不能包含对堆栈上数据的任何引用。另一方面,声明add_account不限制类型的生命周期:它相当于fn add_account<'a, A: Account + 'a>(&self, account: A) {.

解决方案是确保 A 型的寿命足够长。最简单的方法就是添加A: 'static错误消息中建议的绑定(fn add_account<A: Account + 'static>(&self, account: A) {).

如果您不想复制帐户数据,您可以执行更复杂的操作,如下所示:

struct Accounts<'a> {
    accounts: Vec<&'a Account + 'a>
}

impl<'a> Accounts<'a> {
    fn new() -> Accounts<'a> {
        Accounts { accounts: Vec::new() }
    }

    fn add_account<A: Account + 'a>(&mut self, account: &'a A) {
        self.accounts.push(Box::new(account));
    }
}

不过,此时您拥有的数据结构可能比您实际需要的更通用。

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

参数类型可能存在的时间不够长 的相关文章

随机推荐

  • 是什么导致同一弹性搜索查询在两个节点上的搜索结果不同

    我有一个两个节点的弹性搜索设置 其中一个节点上的相同搜索查询会产生与另一个节点上不同的结果 我想找出为什么会出现这种情况 细节 相同的文档 相同的内容和 ID 在两个节点上具有不同的分数 从而导致不同的排序顺序 它是可重现的 我可以删除整个
  • git 公钥以获取更多存储库

    我遇到以下问题 我有 2 个项目 我使用 github 第一个项目进展顺利 我创建了一个公钥 输入密码并推送到 github 没问题 第二个项目 我创建了另一个公钥 当我想推送到第二个存储库时 它不断要求输入第一个代码 ssh id rsa
  • 重构:从值或现有承诺返回承诺

    我的场景 我曾经有一些node js实施完成使用callbacks但我现在正在重构我的代码以使用Promises相反 使用Q模块 我有以下内容update 函数 其中内部 update 函数已经返回一个Promise exports upd
  • 使用 Java MongoDb 驱动程序进行 Bson 漂亮打印

    我正在使用 Mongo 聚合框架 该框架使用 Java MongoDB 驱动程序版本 3 3 我有一个聚合管道 这只是类型的集合List
  • 将 ctypes 与 jython 一起使用

    我在 python 脚本中使用 ctypes lib 时遇到问题 这是我的代码 在互联网上找到 if name main from ctypes import user32 windll user32 kernel32 windll ker
  • Windows Phone 8.1 Silverlight 和 XAML

    有什么方法可以将 XAML 控件添加到我的 WP 8 1 Silverlight 应用程序中吗 我想使用进度环和切换开关 但似乎 Silverlight 没有它们 我怎样才能添加它们 顺便说一句 添加 使用 Windows UI Xaml
  • 文件夹未推送到 GitHub,仅显示为图标

    我试图添加我的OnlineStore文件夹到GitHub其中有两个主要文件夹 AServerApp and a ClientApp 不知道我做错了什么 ClientApp 文件夹看起来像这样 我什至无法单击它进入内部 这也是它的实际链接 h
  • 为什么gcc使用movl而不是push来传递函数参数?

    注意这段代码 include
  • CSS 边框小于 1px [重复]

    这个问题在这里已经有答案了 可能的重复 HTML 子像素边框 默认border 1px太大了 然而 border 0 5px solid 不管用 有没有一种 CSS 解决方案可以使边框大小减半 像素是渲染物体的最小单位值 但是您可以通过修改
  • sencha touch 消息框不可点击

    在 sencha touch 中 我们在消息框方面遇到了一些问题 看起来是android 4 3的东西 在大多数设备上它都可以完美工作 但在 Android 4 3 的设备上 当用户按下按钮时 消息框不会消失 Ext define Test
  • addChildViewController 实际上做了什么?

    我刚刚第一次涉足 iOS 开发 我要做的第一件事就是实现一个自定义容器视图控制器 我们称之为SideBarViewController 交换它显示的几个可能的子视图控制器中的哪一个 几乎与标准完全相同标签栏控制器 这几乎是一个标签栏控制器但
  • HTML:防止 POST 表单的 url 编码

    我有一个 HTML 表单 必须将其发布到 URL 我希望表单能够发布一个名为 DATA 的变量 如下所示 DATA somevar someval somevar2 someotherval 我在做这件事时遇到了麻烦 看来默认情况下 会对数
  • iOS 的免费语音识别引擎?

    我正在寻找一些免费的语音识别引擎来在我的 iPhone 应用程序中使用 你能推荐吗 Nuance 刚刚为开发人员打开了大门龙移动SDK 他们是行业领导者 看一下NDEV 移动
  • Swift 3.0 和 Xcode 8 迁移后未调用 UITableViewDelegate 方法

    将我的代码库从 Swift 2 2 迁移到 Swift 3 0 后 我注意到我的UITableView页脚没有显示 事实证明我的都没有UITableViewDelegate方法被调用 例如 func tableView tableView
  • 如何从 PHP 解析以文本/xml 形式发送到服务器的 XML?

    我有一个用 jQuery 编写的客户端脚本 它将文本 xml 数据发送到服务器 但我不知道如何解析请求 因为数据不是查询字符串变量 jQuery 看起来像这样 jQuery ajax url test php type POST proce
  • Jetty 9 及更高版本中的 SelectChannelConnector 替代类

    jetty 9及以上版本的SelectChannelConnector的替代类是什么 另外 SelectChannelConnector 类有什么用 连接器类在 jetty servlet 架构中有何用途 我们可以使用 ServerConn
  • Python正则表达式提取日期

    我的字符串看起来像这样 server date YYYYMMDD int server date MON DAY YYYY int 还有更多 不同的日期格式 此外 可以有任意数量的 块 并且它们可以以任意顺序出现 我试图获取 Python
  • 如何通过 Docusign API 将动态图像添加到 Docusign 文档

    我不知道 Docusign API 是否可以实现这一点 但我很好奇是否可以将动态图像添加到模板文档中 此动态图像的目的是根据发送者的身份为文档设置徽标 我知道 Docusign 有品牌 但我们希望此图像位于模板文档的特定位置 如果有人知道这
  • 1 到 100 之间的正则表达式编号

    我搜索了很多 找不到这个 RegExp 的解决方案 我不得不说我在 Reg Expressions 方面不是很有经验 Regex 1 9 0 9 1 100 我想测试一个数字1 到 100 之间 不包括 0 Try 1 9 0 9 100
  • 参数类型可能存在的时间不够长

    我有一个简单的程序 我试图实现多态帐户类型 enum AccountType INVALID TYPE1 TYPE2 trait Account fn get name self gt String fn get type self gt