From trait实现会造成损失吗?

时间:2018-07-10 17:15:52

标签: rust type-conversion

上下文

我的程序中有一对相关的结构RomProfiledRom。它们都存储u8值的列表,并实现一个公共特征GetRom,以提供对这些值的访问。

trait GetRom {
    fn get(&self, index: usize) -> u8;
}

区别在于Rom仅包装了一个简单的Vec<u8>,但是ProfiledRom将每个字节包装为ProfiledByte类型,该类型计算{ {1}}。

get

我的大部分程序都在struct Rom(Vec<u8>); struct ProfiledRom(Vec<ProfiledByte>); struct ProfiledByte { value: u8; get_count: u32; }; 值上运行,因此我可以根据是否要进行概要分析来替换trait GetRomRom类型/值。

问题

我实现了ProfiledRom,因为将From<Rom> for ProfiledRom转换为Rom仅涉及将每个字节包装在新的ProfiledRom中:这是一种简单且无损的操作。

但是,我不确定实现ProfiledByte是否合适,因为From<ProfiledRom> for Rom包含无法在ProfiledRom中表示的信息(获取计数)。如果进行往返转换,这些值将丢失/重置。

仅使用部分源对象时,实现Rom特性是否合适?

相关

我已经看到标准库没有实现From之类的整数转换,因为这些转换可能导致字节被截断/丢失。但是,这似乎与我们这里的情况有些不同。

使用可能会被截断的整数转换,您需要检查原始的From<i64> for i32才能知道它是否将被适当地转换。否则,当您获得超出范围的值时,行为或代码可能会意外更改。但是,在上述情况下,始终会静态清除正在保留哪些数据以及正在丢失哪些数据。转换的行为不会突然改变。它应该更安全,但是可以适当使用i64特性吗?

1 个答案:

答案 0 :(得分:2)

From实现通常是无损的,但目前尚无严格要求。

rust-lang/rfcs#2484正在进行的讨论是相关的。一些可能性包括添加FromLossy特征和更准确地规定From的行为。我们将不得不去看看。

请考虑一下,这是标准库中的一些Target::from(Source)实现:

无损失的转换

每个Source值都转换为一个不同的Target值。

混乱的转换

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

相关问题