有没有办法覆盖 Rust 类型的赋值运算符? [重复]

问题描述 投票:0回答:1

我的问题如下:我想设置一个具有更有限值范围的类似原始结构。如

#[repr(transparent)]
struct MyLimitedInt {
  v: i8,
}

但确保

v
的值始终在
-10
10
之间。我知道我可以实现
std::ops
特征来检查加法等的值,但似乎没有一种方法可以以类似原始的方式构造
MyLimitedInt
的实例,同时仍然检查边界(如在
let my_v: MyLimitedInt = -12;
中,应将值限制为
-10
)。

在类似 C 的语言中,我可能可以通过覆盖类型的

=
运算符来做到这一点,但是有没有办法在 Rust 中实现类似的结果,而不需要更详细的构造函数或设置器?

rust operator-overloading
1个回答
2
投票

Rust 中不能重载赋值运算符。但是,您可以重载其他运算符或改用方法 - 例如:

use std::cmp::{min, max};

#[repr(transparent)]
struct MyLimitedInt {
  v: i8,
}

impl MyLimitedInt {
  pub fn from_clamped(value: i8) -> Self {
    Self { v: min(10, max(value, -10))
  }

  /// Sets the value of the int, constraining it to the range [-10, 10]
  pub fn set_clamped(&mut self, value: i8) {
    *self = Self::from_clamped(value);
  }
}

这可以通过算术运算符的重载进行扩展,使其更像原语一样使用:

use std::ops::Add;

impl Add for MyLimitedInt {
  type Output = Self;

  fn add(self, other: Self) -> Self {
    Self::from_clamped(self.value + other.value)
  }
}

impl Add<i32> for MyLimitedInt {
  type Output = Self;

  fn add(self, other: i32) -> Self {
    Self::from_clamped(self.value + other.value)
  }
}

这使得可以将加法运算符与

MyLimitedInt
一起使用,自动限制结果:

let x = MyLimitedInt::from_clamped(20) + 5; // 10
let y = MyLimitedInt::from_clamped(-20) + x; // 0
© www.soinside.com 2019 - 2024. All rights reserved.