qidao123.com技术社区-IT企服评测·应用市场

标题: 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs) [打印本页]

作者: 冬雨财经    时间: 3 天前
标题: 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
一、源码

该代码定义了一个类型体系中的零类型Z0,并为实在现了基本的算术运算(加法、减法、乘法、除法)。这是一个典范的类型级编程示例,使用Rust的类型体系在编译期进行数学运算。
  1. //! 零类型(Z0)及其算术运算实现
  2. //!
  3. //! 本模块定义了类型系统中的零类型,并为其实现了基本算术运算。
  4. //! 所有运算遵循数学规则,特别是零元素的算术特性。
  5. use core::ops::{Add, Sub, Mul, Div};
  6. use core::marker::PhantomData;
  7. use crate::sealed::Sealed;
  8. use super::{Positive, Neg, Integer, Null};
  9. /// 零类型实现Sealed标记trait
  10. impl Sealed for Z0 {}
  11. /// 类型系统中的零类型表示
  12. ///
  13. /// # 示例
  14. /// ```
  15. /// use type_arithmetic::Z0;
  16. ///
  17. /// let zero = Z0;
  18. /// ```
  19. #[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
  20. pub struct Z0;
  21. // ========== 加法运算实现 ==========
  22. /// 零加零等于零
  23. impl Add<Z0> for Z0 {
  24.     type Output = Z0;
  25.    
  26.     #[inline]
  27.     fn add(self, _rhs: Z0) -> Self::Output {
  28.         Z0
  29.     }
  30. }
  31. /// 零加正数等于该正数
  32. impl<P: Positive> Add<P> for Z0 {
  33.     type Output = P;
  34.    
  35.     #[inline]
  36.     fn add(self, rhs: P) -> Self::Output {
  37.         rhs
  38.     }
  39. }
  40. /// 正数加零等于该正数
  41. impl<P: Positive> Add<Z0> for P {
  42.     type Output = P;
  43.    
  44.     #[inline]
  45.     fn add(self, _rhs: Z0) -> Self::Output {
  46.         self
  47.     }
  48. }
  49. /// 负数加零等于该负数
  50. impl<P: Positive> Add<Z0> for Neg<P> {
  51.     type Output = Neg<P>;
  52.    
  53.     #[inline]
  54.     fn add(self, _rhs: Z0) -> Self::Output {
  55.         self
  56.     }
  57. }
  58. // ========== 减法运算实现 ==========
  59. /// 零减零等于零
  60. impl Sub for Z0 {
  61.     type Output = Z0;
  62.    
  63.     #[inline]
  64.     fn sub(self, _rhs: Self) -> Self::Output {
  65.         Z0
  66.     }
  67. }
  68. /// 零减正数等于对应负数
  69. impl<P: Positive> Sub<P> for Z0 {
  70.     type Output = Neg<P>;
  71.    
  72.     #[inline]
  73.     fn sub(self, _rhs: P) -> Self::Output {
  74.         Neg::<P>::default()
  75.     }
  76. }
  77. /// 零减负数等于对应正数
  78. impl<P: Positive> Sub<Neg<P>> for Z0 {
  79.     type Output = P;
  80.    
  81.     #[inline]
  82.     fn sub(self, _rhs: Neg<P>) -> Self::Output {
  83.         P::default()
  84.     }
  85. }
  86. /// 正数减零等于该正数
  87. impl<P: Positive> Sub<Z0> for P {
  88.     type Output = P;
  89.    
  90.     #[inline]
  91.     fn sub(self, _rhs: Z0) -> Self::Output {
  92.         self
  93.     }
  94. }
  95. /// 负数减零等于该负数
  96. impl<P: Positive> Sub<Z0> for Neg<P> {
  97.     type Output = Neg<P>;
  98.    
  99.     #[inline]
  100.     fn sub(self, _rhs: Z0) -> Self::Output {
  101.         self
  102.     }
  103. }
  104. // ========== 乘法运算实现 ==========
  105. /// 零乘零等于零
  106. impl Mul for Z0 {
  107.     type Output = Z0;
  108.    
  109.     #[inline]
  110.     fn mul(self, _rhs: Self) -> Self::Output {
  111.         Z0
  112.     }
  113. }
  114. /// 零乘正数等于零
  115. impl<P: Positive> Mul<P> for Z0 {
  116.     type Output = Z0;
  117.    
  118.     #[inline]
  119.     fn mul(self, _rhs: P) -> Self::Output {
  120.         Z0
  121.     }
  122. }
  123. /// 零乘负数等于零
  124. impl<P: Positive> Mul<Neg<P>> for Z0 {
  125.     type Output = Z0;
  126.    
  127.     #[inline]
  128.     fn mul(self, _rhs: Neg<P>) -> Self::Output {
  129.         Z0
  130.     }
  131. }
  132. /// 正数乘零等于零
  133. impl<P: Positive> Mul<Z0> for P {
  134.     type Output = Z0;
  135.    
  136.     #[inline]
  137.     fn mul(self, _rhs: Z0) -> Self::Output {
  138.         Z0
  139.     }
  140. }
  141. /// 负数乘零等于零
  142. impl<P: Positive> Mul<Z0> for Neg<P> {
  143.     type Output = Z0;
  144.    
  145.     #[inline]
  146.     fn mul(self, _rhs: Z0) -> Self::Output {
  147.         Z0
  148.     }
  149. }
  150. // ========== 除法运算实现 ==========
  151. /// 零除以正数等于零
  152. impl<P: Positive> Div<P> for Z0 {
  153.     type Output = Z0;
  154.    
  155.     #[inline]
  156.     fn div(self, _rhs: P) -> Self::Output {
  157.         Z0
  158.     }
  159. }
  160. /// 零除以负数等于零
  161. impl<P: Positive> Div<Neg<P>> for Z0 {
  162.     type Output = Z0;
  163.    
  164.     #[inline]
  165.     fn div(self, _rhs: Neg<P>) -> Self::Output {
  166.         Z0
  167.     }
  168. }
  169. // 注意:正数/零和负数/零未实现,因为数学上除以零未定义
  170. #[cfg(test)]
  171. mod tests {
  172.     use super::*;
  173.     use crate::{P1, N1};
  174.    
  175.     #[test]
  176.     fn test_z0_addition() {
  177.         let zero = Z0;
  178.         let p1 = P1::default();
  179.         let n1 = N1::default();
  180.         
  181.         assert_eq!(zero + p1, p1);
  182.         assert_eq!(zero + n1, n1);
  183.         assert_eq!(p1 + zero, p1);
  184.         assert_eq!(n1 + zero, n1);
  185.     }
  186.    
  187.     #[test]
  188.     fn test_z0_subtraction() {
  189.         let zero = Z0;
  190.         let p1 = P1::default();
  191.         let n1 = N1::default();
  192.         
  193.         assert_eq!(zero - p1, N1::default());
  194.         assert_eq!(zero - n1, P1::default());
  195.         assert_eq!(p1 - zero, p1);
  196.         assert_eq!(n1 - zero, n1);
  197.     }
  198.    
  199.     #[test]
  200.     fn test_z0_multiplication() {
  201.         let zero = Z0;
  202.         let p2 = P1::default();
  203.         let n1 = N1::default();
  204.         
  205.         assert_eq!(zero * p1, zero);
  206.         assert_eq!(zero * n1, zero);
  207.         assert_eq!(p1 * zero, zero);
  208.         assert_eq!(n1 * zero, zero);
  209.     }
  210.    
  211.     #[test]
  212.     fn test_z0_division() {
  213.         let zero = Z0;
  214.         let p1 = P1::default();
  215.         let n1 = N1::default();
  216.         
  217.         assert_eq!(zero / p1, zero);
  218.         assert_eq!(zero / n1, zero);
  219.     }
  220.    
  221.     #[test]
  222.     fn test_z0_interactions() {
  223.         let zero = Z0;
  224.         let p1 = P1::default();
  225.         let n1 = N1::default();
  226.         
  227.         assert_eq!(zero + p1, P1::default());
  228.         assert_eq!((zero - p1) + n1, zero);
  229.         assert_eq!((p1 + zero) * n1, N1::default());
  230.     }
  231. }
复制代码
二、核心概念


三、运算实现细节

加法运算


减法运算


乘法运算


除法运算


四、测试用例

代码包含了详尽的测试用例,验证了:
五、设计特点

这种类型级编程技能常用于需要编译期盘算和验证的场景,如维度检查、单位体系等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4