Module std::ops 1.0.0[−][src]
Expand description
可重载的运算符。
实现这些 traits 可使您重载某些运算符。
其中的某些 traits 由 prelude 导入,因此在每个 Rust 程序中都可用。只能重载由 traits 支持的运算符。
例如,可以通过 Add trait 重载加法运算符 (+),但是由于赋值运算符 (=) 没有后备 trait,因此无法重载其语义。
此外,此模块不提供任何机制来创建新的运算符。
如果需要无特征重载或自定义运算符,则应使用宏或编译器插件来扩展 Rust 的语法。
考虑到它们的通常含义和 operator precedence,运算符 traits 的实现在它们各自的上下文中应该不足为奇。
例如,当实现 Mul 时,该操作应与乘法有些相似 (并共享期望的属性,如关联性)。
请注意,&& 和 || 运算符发生短路,即,它们仅在第二操作数对结果有贡献的情况下才对其求值。由于 traits 无法强制执行此行为,因此不支持 && 和 || 作为可重载的运算符。
许多运算符都按值取其操作数。在涉及内置类型的非泛型上下文中,这通常不是问题。
但是,如果必须重用值而不是让运算符使用它们,那么在泛型代码中使用这些运算符就需要引起注意。一种选择是偶尔使用 clone。
另一个选择是依靠所涉及的类型,为引用提供其他运算符实现。
例如,对于应该支持加法的用户定义类型 T,将 T 和 &T 都实现 traits Add<T> 和 Add<&T> 可能是一个好主意,这样就可以编写泛型代码而不必进行不必要的克隆。
Examples
本示例创建一个实现 Add 和 Sub 的 Point 结构体,然后演示加减两个 Point。
use std::ops::{Add, Sub}; #[derive(Debug, Copy, Clone, PartialEq)] struct Point { x: i32, y: i32, } impl Add for Point { type Output = Self; fn add(self, other: Self) -> Self { Self {x: self.x + other.x, y: self.y + other.y} } } impl Sub for Point { type Output = Self; fn sub(self, other: Self) -> Self { Self {x: self.x - other.x, y: self.y - other.y} } } assert_eq!(Point {x: 3, y: 3}, Point {x: 1, y: 0} + Point {x: 2, y: 3}); assert_eq!(Point {x: -1, y: -3}, Point {x: 1, y: 0} - Point {x: 2, y: 3});Run
有关示例实现,请参见每个 trait 的文档。
Fn,FnMut 和 FnOnce traits 由可以像函数一样调用的类型实现。请注意,Fn 占用 &self,FnMut 占用 &mut self,FnOnce 占用 self。
这些对应于可以在实例上调用的三种方法: 引用调用、可变引用调用和值调用。
这些 traits 的最常见用法是充当以函数或闭包为参数的高级函数的界限。
以 Fn 作为参数:
fn call_with_one<F>(func: F) -> usize where F: Fn(usize) -> usize { func(1) } let double = |x| x * 2; assert_eq!(call_with_one(double), 2);Run
以 FnMut 作为参数:
fn do_twice<F>(mut func: F) where F: FnMut() { func(); func(); } let mut x: usize = 1; { let add_two_to_x = || x += 2; do_twice(add_two_to_x); } assert_eq!(x, 5);Run
以 FnOnce 作为参数:
fn consume_with_relish<F>(func: F) where F: FnOnce() -> String { // `func` 使用其捕获的变量,因此不能多次运行 // println!("Consumed: {}", func()); println!("Delicious!"); // 再次尝试调用 `func()` 将为 `func` 引发 `use of moved value` 错误 // } let x = String::from("x"); let consume_and_return_x = move || x; consume_with_relish(consume_and_return_x); // `consume_and_return_x` 现在不能再被调用Run
Structs
| Range | (half-open) 范围包括在 ( |
| RangeFrom | 范围仅包括 ( |
| RangeFull | 无限制范围 ( |
| RangeInclusive | 范围包括 ( |
| RangeTo | 范围仅排在 ( |
| RangeToInclusive | 范围仅包括 ( |
Enums
| GeneratorState | Experimental 恢复生成器的结果。 |
| Bound | 一系列键的端点。 |
| ControlFlow | 用于告诉操作是应该提前退出还是像往常一样继续操作。 |
Traits
| CoerceUnsized | Experimental Trait,指示这是一个指针或一个包装器,其中可以在指针上执行大小调整。 |
| DispatchFromDyn | Experimental 这用于对象安全,以检查是否可以分派方法的接收者类型。 |
| FromResidual | Experimental 用于指定哪些残差可以转换为哪些 |
| Generator | Experimental 由内置生成器类型实现的 trait。 |
| Try | Experimental
|
| Add | 加法运算符 |
| AddAssign | 加法赋值运算符 |
| BitAnd | 按位与运算符 |
| BitAndAssign | 按位与分配运算符 |
| BitOr | 按位或运算符 |
| BitOrAssign | 按位或赋值运算符 |
| BitXor | 按位 XOR 运算符 |
| BitXorAssign | 按位 XOR 赋值运算符 |
| Deref | 用于不可变解引用操作,例如 |
| DerefMut | 用于可变解引用操作,例如在 |
| Div | 除法运算符 |
| DivAssign | 部门分配运算符 |
| Drop | 析构函数中的自定义代码。 |
| Fn | 采用不可变接收者的调用运算符的版本。 |
| FnMut | 采用可变接收者的调用运算符的版本。 |
| FnOnce | 具有按值接收者的调用运算符的版本。 |
| Index | 用于在不可变上下文中索引操作 ( |
| IndexMut | 用于可变上下文中的索引操作 ( |
| Mul | 乘法运算符 |
| MulAssign | 乘法分配运算符 |
| Neg | 一元求反运算符 |
| Not | 一元逻辑否定运算符 |
| RangeBounds |
|
| Rem | 余数运算符 |
| RemAssign | 余数赋值运算符 |
| Shl | 左移位运算符 |
| ShlAssign | 左移赋值运算符 |
| Shr | 右移运算符 |
| ShrAssign | 右移赋值运算符 |
| Sub | 减法运算符 |
| SubAssign | 减法赋值运算符 |