《铁 rust 》:

let int: i32 = 3;
let float: f32 = 3.3;
let res = int*float; // Invalid
let res = (int as f32)*float; // Valid

为了方便起见,我希望在*操作符上实现覆盖,考虑到Rust的错误消息,这似乎是可能的:

cannot multiply `{integer}` by `{float}`
the trait `Mul<{float}>` is not implemented for `{integer}`
the following other types implement trait `Mul<Rhs>`:

但写impl Mul<i32> for f32显然也是不可能的:

only traits defined in the current crate can be implemented for primitive types
define and implement a trait or new type instead

那么,这应该怎么做呢?有没有 crate 已经在实施这些?

推荐答案

您不能为基元实现MUL.这是Rusts外来类型规则的一部分:对于您的 crate 中的实现,必须在您的 crate 中定义至少一个实现的类型或特征.因为Mul和原语都没有在您的代码中定义,所以您不能为它们创建实现.

如果您真的想要这样做,您需要在F32周围创建一个包装器类型,并在上面实现Mul和所有其他相关运算符.

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

如何找到一个数字在二维数组中的位置(S)?

如何最好地并行化修改同一Rust向量的多个切片的代码?

关于如何初始化弱 struct 字段的语法问题

如何点击()迭代器?

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

铁 rust ,我的模块介绍突然遇到了一个问题

如何创建一个可变的嵌套迭代器?

如何实现Deref;多次;?

为什么rustc会自动降级其版本?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

如何将带有嵌套borrow /NLL 的 Rust 代码提取到函数中

为什么`tokio::main`可以直接使用而不需要任何导入?

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

Rustlings 切片原语

有没有办法在 Rust 中对 BigInt 进行正确的位移?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

为什么当borrow 变量发生变化时,borrow 变量不会改变?

为什么一个整型变量赋值给另一个变量后仍然可以使用?