我的程序中有一对相关的结构,Rom并且ProfiledRom.它们都存储u8值列表并实现共同特征GetRom,以提供对这些值的访问.
trait GetRom {
fn get(&self, index: usize) -> u8;
}
Run Code Online (Sandbox Code Playgroud)
区别在于Rom只包装一个简单的Vec<u8>,但ProfiledRom将每个字节包装在一个ProfiledByte计算返回次数的类型中get.
struct Rom(Vec<u8>);
struct ProfiledRom(Vec<ProfiledByte>);
struct ProfiledByte {
value: u8;
get_count: u32;
};
Run Code Online (Sandbox Code Playgroud)
我的大部分程序都在trait GetRom值上运行,因此我可以替换in Rom或ProfiledRomtype/value,具体取决于我是否要进行分析.
我已经实现了From<Rom> for ProfiledRom,因为将a转换Rom为ProfiledRomjust只涉及将每个字节包装成一个新的ProfiledByte:一个简单且无损的操作.
但是,我不确定它是否适合实现From<ProfiledRom> for Rom,因为ProfiledRom包含无法在a中表示的信息(获取计数)Rom.如果您进行了往返转换,则这些值将丢失/重置.
From当只使用部分源对象时,是否适合实现特征?
我已经看到标准库没有实现整数转换,From<i64> for i32因为这些可能导致字节被截断/丢失.然而,这似乎与我们在这里的情况有些截然不同.
使用可能截断的整数转换,您需要检查原始文件i64以了解它是否会被适当地转换.如果不这样做,当您获得越界值时,行为或代码可能会意外更改.但是,在上面的例子中,它总是静态地清楚保留了什么数据以及丢失了哪些数据.转换的行为不会突然改变.它应该更安全,但它是否适合使用该From特性?
小智 2
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>)失去元素的顺序。Vec<T>::from(VecDeque<T>)失去 暴露的元素的内部分裂.as_slices()。
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |