rust - 超特征边界中的生命周期参数
问题描述
我正在尝试为可转换为字节切片的对象定义一个特征。我本质上想说
trait Foo: AsRef<[u8]> + TryFrom<&[u8]> {}
不幸的是,除非我在引用上放置生命周期参数,否则它拒绝编译,如下所示:
trait Foo<'a>: AsRef<[u8]> + TryFrom<&'a [u8]> {}
这对我来说没有多大意义,因为生命周期'a
与最终try_from()
调用有关,不应该是对象类型的一部分。(try_from()
复制相关字节的实现,因此其参数的生命周期实际上并不相关。)
不过,这似乎是一个比切片更普遍的问题;你如何为超特征边界指定这样的生命周期参数?(显然'_
不起作用。)有没有更好/更惯用的方式来表达这一点,还是我不得不求助于某种手工定制的废话,比如
pub trait TryFromRef<T> { type Error; fn try_from(value: &T) -> Result<Self, Self::Error>; }
?
解决方案
一个具有生命周期参数的特征绑定,该参数适用于所有生命周期,而不是某个特定的生命周期,可以使用所谓的更高等级的特征边界或 HRTB 来指定。在您的情况下,这可能看起来像
trait Foo: AsRef<[u8]> + for<'a> TryFrom<&'a [u8]> {}
任何实现都Foo
必须满足TryFrom<&'a u8>
的任何和所有选择,因此它本身'a
不需要生命周期。Foo
也可以看看
推荐阅读
- c# - Windows 通用 (IoT) Websocket 服务器到广播
- javascript - 尝试删除 GoogleMaps 组件 (Vue) 中的标记时,“无法读取未定义的 'setMap' 的属性”
- beautifulsoup - BS4 遍历表元素 nextsibling 或 parent?
- php - 在 PHP 客户端库中处理分页的最佳方法
- c# - OnGUI 和 Coroutine 移动对象:非常奇怪的行为
- c# - Mono.Cecil AssemblyDefinition.ReadAssembly():找不到文件的符号
- reactjs - 为什么 Jest 在 componentDidMount 完成执行之前运行断言(使用 React Test Renderer)?
- xaml - 如何从平板电脑/手机模板访问代码?
- promise - Sequelize 检查行是否存在,并返回布尔值
- javascript - 根据 href 更改按钮文本