在mutagen中,我使用专门化进行变异
尽可能的二元运算。基本上,我用a + b
替换
::mutagen::AddSub::add(a, b, mutation_count)
唉,它在场时失败了
转移操作,因为类型推断失败。
我已将问题简化为非常简单的测试用例:
use std::ops::Shl;
fn main() {
println!("{}", 1u32.shl(2) * 3);
}
error[E0277]: cannot multiply i32 to u32
失败。这似乎是
因为std::ops::Shl
是针对各种整数实现的,所以会发生这种情况
而那些impl
总是返回自我类型(但不是自我,正如我所看到的那样)
来源),typeck可能看不到它们,并且空洞,默认
到i32
。如果您将1u32.shl(2)
替换为(1u32 << 2)
,则可以。
因此转发std::ops::Shl
/ Shr
无法使用自定义特征
(如在pub trait AddSub
中)或在左侧使用包装类型
操作。在这两种情况下,类型推断都无法看到相等的
Self
和Self::Output
用于整数转换,尽管知道Self
。
这是一个错误吗?有解决方法吗?是什么原因造成的?
答案 0 :(得分:5)
这不是错误。原因是一些special binary operations handling for non (or semi-)inferred types in typeck。
解决方法是使用if
表达式修复表达式的返回类型,其中一个分支是原始二进制操作,另一个是变异操作,例如
(if ::mutagen::now(42) {
::mutagen::ShlShr::shl(left, right)
} else {
left << right
})