types - 为什么 std::ops::Shl::shl 不等于 <<?

标签 types rust

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 )或在左侧使用包装类型 操作。在这两种情况下,类型推断都看不到相等性 SelfSelf::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/

相关文章:

C# native 数据类型与 .NET CTS 类型

vector - 尝试索引到 Rust 中的向量时出现 SliceIndex 特征绑定(bind)不满足错误

rust - 如何将 Box 值传递给函数

java - 如何在java中使用类型变量创建参数化类型?

c - 在 C 的宏中声明类型为 t 的变量

UDP `join_multicast` 导致 OtherIOError

rust - 如何在没有结构包装的情况下为基元创建标称类型?

rust - 找不到 cargo 添加 `Command failed due to unhandled error: reference ' refs/remotes/origin/master'

c++ - 反对使用 size_t 的理由是什么?

c# - Entity Framework 4 自定义数据类型