从特质实施可以有损吗?

9 type-conversion rust

上下文

我的程序中有一对相关的结构,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 RomProfiledRomtype/value,具体取决于我是否要进行分析.

我已经实现了From<Rom> for ProfiledRom,因为将a转换RomProfiledRomjust只涉及将每个字节包装成一个新的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值。

有损转换

多个Source值可以转换为相同的Target值。