rust - From trait 实现可以是有损的吗?
问题描述
语境
我的程序中有一对相关的结构,Rom
并且ProfiledRom
. 它们都存储一个u8
值列表并实现一个共同的特征 ,GetRom
以提供对这些值的访问。
trait GetRom {
fn get(&self, index: usize) -> u8;
}
不同之处在于它只Rom
包装了一个简单的Vec<u8>
,但ProfiledRom
将每个字节包装在一个ProfiledByte
类型中,该类型计算它返回的次数get
。
struct Rom(Vec<u8>);
struct ProfiledRom(Vec<ProfiledByte>);
struct ProfiledByte {
value: u8;
get_count: u32;
};
我的大部分程序都对值进行操作,因此我可以根据是否要进行分析来trait GetRom
替换Rom
或键入/值。ProfiledRom
问题
我已经实现From<Rom> for ProfiledRom
了,因为将 a 转换Rom
为 aProfiledRom
只涉及将每个字节包装在一个新的中ProfiledByte
:一个简单且无损的操作。
但是,我不确定是否适合实施From<ProfiledRom> for Rom
,因为ProfiledRom
包含无法在Rom
. 如果您进行了往返转换,这些值将丢失/重置。
From
当只使用源对象的一部分时,是否适合实现特征?
有关的
我已经看到标准库没有实现整数转换,From<i64> for i32
因为这些可能导致字节被截断/丢失。然而,这似乎与我们这里的情况有些不同。
使用可能截断的整数转换,您需要检查原始数据i64
以了解它是否会被正确转换。否则,当您获得越界值时,行为或代码可能会意外更改。然而,在我们上面的例子中,什么数据被保存和什么数据丢失总是静态的清楚。转换的行为不会突然改变。它应该更安全,但它是否适合使用该From
特征?
解决方案
From
实现通常是无损的,但目前没有严格的要求。
rust-lang/rfcs#2484上正在进行的讨论是相关的。一些可能性包括添加FromLossy
特征和更准确地规定From
. 我们将不得不看看它的去向。
Target::from(Source)
作为考虑,以下是标准库中的一些实现:
无损转换
每个Source
值都转换为不同的Target
值。
u16::from(u8)
,i16::from(u8)
以及其他到严格更大的整数类型的转换。Vec<T>::from(BinaryHeap<T>)
OsString::from(String)
char::from(u8)
有损转换
多个Source
值可以转换为相同的Target
值。
BinaryHeap<T>::from(Vec<T>)
失去了元素的顺序。Box<[T]>::from(Vec<T>)
并Box<str>::from(String)
失去任何过剩的产能。Vec<T>::from(VecDeque<T>)
丢失 . 暴露的元素的内部拆分.as_slices()
。
推荐阅读
- javascript - TypeError:尽管遵循所有 SO 答案,但无法读取 null 的属性“appendChild”
- sql - 优先考虑子搜索,在合理的时间内返回结果
- php - Laravel Eloquent 属性转换不起作用
- sqlite - 未找到面对 SQlite3 模块 - SAP CAP 示例
- java - 如何使用 Java Tester 以及主要的 Java 类来处理诸如 Half 或 Quarter 之类的分数
- android - Android xml 设计减慢了我的应用程序
- python - 系列的熊猫数据框,按名称获取系列
- javascript - 使用 JS 的简单用户名提示无法正常工作
- powerbi - 单击图表信息时如何重定向
- java - 使用没有 JsonSubTypes 的杰克逊将接口反序列化为特定类型