告诉编译器泛型返回类型不借用任何对参数的引用?

2024-04-06

tldr;> 给定一个接受通用回调参数并返回关联类型的特征函数,编译器会抱怨关联类型可能从回调函数借用参数。有没有办法告诉编译器事实并非如此?

细节: 我计划实现一个接受回调参数的特征函数,并希望强制该特征函数的实现实际调用该回调。我通过让回调返回一个只能通过调用此回调来构造的类型,并强制特征函数返回该类型来实现此目的。

/// If this type is used as a generic argument in a trait function and that trait function
/// returns `CallbackResult`, then that enforces that any implementation of that
/// trait function must call the callback.
pub trait Callback<T> {
    type CallbackResult;

    fn call(self, v: T) -> Self::CallbackResult;
}

有关如何使用它的示例:

trait MyTrait {
  fn func<C>(&self, callback: C) -> C::CallbackResult
  where
    C: Callback<i32>;
}

struct MyStruct {}
impl MyTrait for MyStruct {
  fn func<C>(&self, callback: C) -> C::CallbackResult
  where
    C: Callback<i32>,
  {
    // The compiler forces us to call callback because that's the only way
    // for us to create a value of type C::CallbackResult.
    let v = 42;
    callback.call(v)
  }
}

这有效:

当回调获取引用时,问题就出现了:

trait MyTrait {
  fn func<C>(&self, callback: C) -> <C as Callback<&i32>>::CallbackResult
  where
    C: for <'a> Callback<&'a i32>;
}

struct MyStruct {}
impl MyTrait for MyStruct {
  fn func<C>(&self, callback: C) -> <C as Callback<&i32>>::CallbackResult
  where
    C: for<'a> Callback<&'a i32>,
  {
    // The compiler forces us to call callback because that's the only way
    // for us to create a value of type C::CallbackResult.
    let v = 42;
    callback.call(&v)
  }
}

现在失败了:

error[E0515]: cannot return value referencing local variable `v`
  --> src/lib.rs:22:5
   |
22 |     callback.call(&v)
   |     ^^^^^^^^^^^^^^--^
   |     |             |
   |     |             `v` is borrowed here
   |     returns a value referencing data owned by the current function

For more information about this error, try `rustc --explain E0515`.
error: could not compile `playground` (lib) due to previous error

所以看来 Rust 假设CallbackResult可以保留参考v。有没有办法告诉编译器它没有?我尝试添加一个界限CallbackResult: 'static到关联的类型,但这没有什么区别。


None

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

告诉编译器泛型返回类型不借用任何对参数的引用? 的相关文章

随机推荐

  • 在 selenium 上使用 BeautifulSoup 和 Geckodriver 有什么区别?

    我目前对使用 selenium 3 的 beautiful soup 和 geckodriver 都是新手 我正在开发一个项目 我必须从网页中抓取 URL 我发现它们都用于网页抓取 但无法区分两者之间的区别 BeautifulSoup 和
  • 为什么需要用 pyqtSlot 装饰连接的槽?

    我正在使用 pyqt5 并且使用类似于以下的代码连接了几种方法 self progress canceled connect self cancel 例如 其中self cancel is def cancel self self time
  • iOS:条形样式外观缺少 Monotouch 绑定?

    我正在尝试将其转换为 Monotouch C UINavigationBar appearance setBarStyle UIBarStyleBlackOpaque 但在外观对象上似乎没有条形样式 是否有解决方法或替代接入点 此房源没有装
  • Angular ngRoute 突然将 URL 转换为编码字符 #!/#%2F

    我的应用程序中的所有内容都工作正常 直到我尝试添加 ngAnimate ngMaterial 和 ng image gallery 我不知道添加这些模块是否是问题的根源 但在问题发生之前我没有更改任何其他内容 从那时起 即使在我从 app
  • Android——在 OnDrawFrame 方法之外将 GLSurfaceView.Renderer 置于睡眠状态(如 Thread.sleep(20))

    我想控制 GLSurfaceView Renderer 的渲染速率 我在扩展 GLSurfaceView 的类中实现了一个线程 并在 while true 循环中定期将其置于睡眠状态 这不会减慢渲染器的速度 有一个很好的答案here htt
  • 自旋锁与信号量

    信号量和自旋锁之间的基本区别是什么 我们什么时候会使用信号量而不是自旋锁 自旋锁和信号量主要有四个不同点 1 它们是什么 A spinlock是锁的一种可能实现 即通过忙等待 旋转 实现的锁 信号量是锁的概括 或者 相反 锁是信号量的特例
  • 带有节标题的列表视图android

    在 android listview gt Headerbar section 中是否有可能不滚动 直到该部分的列表不滚动 就像 iPhone 的桌面视图一样 我使用了部分列表视图 但我想要像这个 iphone 表格视图 有没有可能 谢谢
  • Jenkins 在 ClearCase 中创建视图

    我正在使用 Jenkins 和 ClearCase 进行自动构建 但遇到了问题 我编写了一个批处理脚本 使用cleartool命令mkview在ClearCase中创建视图 当我通过单击脚本来执行该脚本时 一切正常 视图是在 ClearCa
  • 解析在tinyxml中

    如何在 TinyXML 中解析以下内容
  • netstandard 1.5 中的 BinaryFormatter

    根据 NET CoreFx API 及其关联的 NET 平台标准版本列表 https github com dotnet corefx blob master Documentation architecture net platform
  • 在 .Net 中使用私有集初始化属性

    public class Foo public string Name get private set lt Because set is private void Main var bar new Foo Name baz lt This
  • 二维数组作为函数的参数

    为什么不能像处理普通数组一样在函数中声明二维数组参数 void F int bar Ok void Fo int bar Not ok void Foo int bar SIZE Ok 为什么需要声明列的大小 静态数组 你似乎没有完全明白这
  • 如何在yii2高级模板中上传web文件夹中的文件?

    我尝试在后端上传文件 每次上传文件时 它都会成功上传并成功保存在数据库中 但它没有保存到我指定的目录中 因此我的应用程序找不到该文件 并且我已经给出了 777对 web 目录中的 uploads 文件夹的权限 下面是我的代码 处理和保存文件
  • 如何使用 Compact Framework 在 C# 中验证 X.509 证书

    我正在尝试使用 C 和 NetCF 验证 X 509 证书 我有 CA 证书 如果我理解正确的话 我需要使用该 CA 证书中的公钥来解密不受信任的证书的签名 这应该给我不可信证书的计算哈希值 然后我应该自己计算证书的哈希值并确保两个值匹配
  • Swift组合:使用其他发布者(使用CombineLatest)的后续发布者不会“触发”

    我正在尝试复制 WWDC 2019 会议 实践中组合 中给出的 向导学校注册 示例https developer apple com videos play wwdc2019 721 https developer apple com vi
  • 属性的访问器实现

    是否有一些文档说明编译器如何自动生成属性的访问器 当编写自定义访问器 覆盖合成的访问器 时 最好了解原始实现 特别是要查看具有不同 弱 强 保留 复制等 属性的属性的访问器的不同实现 是否有一些文档说明编译器如何自动生成属性的访问器 编译器
  • 从 openstreetmap 获取城市边界

    我正在开发一个网站 我需要根据用户输入获取某个区域的所有边界 例如 用户想知道名为 x 的城市的边界 我应该如何从 openstreetmap 获取它 我听说过 xapi 和 osmosis 但在任何地方都找不到任何例子 谢谢 我在这里尝试
  • 使用media3库时添加MediaItem导致错误

    我正在使用最新的Android Media3库 但是我在使用它时发现了一个问题 我创建了一个媒体会话服务 然后得到MediaController中的Activity 然后当我尝试调用媒体控制器并添加一些 MediaItem 时 发生错误 j
  • Python/PyODBC 通过 IP 与可信连接连接到 SQL Server 2008 DB

    如果有人问这个问题 我提前道歉 尽管我发现了类似的问题 但我找不到正确的答案 我正在尝试通过使用可信连接的 IP 端口来连接到 SQL Server 2008 DB 另外一点复杂性是 数据库位于美国境外 通常我们通过 Citrix 登录 登
  • 告诉编译器泛型返回类型不借用任何对参数的引用?

    tldr gt 给定一个接受通用回调参数并返回关联类型的特征函数 编译器会抱怨关联类型可能从回调函数借用参数 有没有办法告诉编译器事实并非如此 细节 我计划实现一个接受回调参数的特征函数 并希望强制该特征函数的实现实际调用该回调 我通过让回