在mutagen ,我使用特化来变异
可能的二进制操作。基本上,我替换了 a + b
和
::mutagen::AddSub::add(a, b, mutation_count)
las,它在场时失败了
移位操作,因为类型推断失败。
我已将问题简化为非常的简单测试用例:
use std::ops::Shl;
fn main() {
println!("{}", 1u32.shl(2) * 3);
}
这失败了 error[E0277]: cannot multiply i32 to u32
.这似乎
发生是因为std::ops::Shl
为各种整数实现,并且
而那些impl
s 总是返回 self 类型(但不是 self ,正如我从
来源),typeck 可能无法看穿它们,并且出现空的,默认
至 i32
.如果更换 1u32.shl(2)
与 (1u32 << 2)
, 它有效。
于是转发std::ops::Shl
/Shr
使用自定义特征都行不通
(如 pub trait AddSub
)或在左侧使用包装类型
操作。在这两种情况下,类型推断都看不到相等性
Self
和 Self::Output
对于整数移位,尽管知道 Self
.
这是一个错误吗?有解决方法吗?是什么原因造成的?
最佳答案
这不是错误。原因是一些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
})
关于types - 为什么 std::ops::Shl::shl 不等于 <<?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49730693/