当前位置:   article > 正文

Rust方法自动解引用测试,总结和补充_rust 自动解引用

rust 自动解引用
  1. // 定义一个结构体MyBox,包含一个原始指针
  2. struct MyBox<T>(T);
  3. // 方法调用 . 操作,对方法的self 进行加& &mut * 还有 无大小转换
  4. trait MyTrait {
  5. fn test0(mut self, x: &i32) where Self: Sized {
  6. println!("test0 :{}", x);
  7. }
  8. fn test1(self, x: &i32) where Self: Sized {
  9. println!("test1: {}", x);
  10. }
  11. fn test2(&self, x: &i32) where Self: Sized {
  12. println!("test2: {}", x);
  13. }
  14. fn test3(&mut self, x: &i32) where Self: Sized {
  15. println!("test3: {}", x);
  16. }
  17. }
  18. impl<T> MyBox<T> {
  19. fn new(x: T) -> MyBox<T> {
  20. MyBox(x)
  21. }
  22. fn test(self: Arc<Self>) {
  23. println!("test type self");
  24. }
  25. }
  26. impl<T> MyTrait for MyBox<T> {}
  27. use std::ops::{Deref, DerefMut};
  28. use std::sync::Arc;
  29. impl<T> Deref for MyBox<T> {
  30. type Target = T;
  31. fn deref(&self) -> &Self::Target {
  32. println!("deref run.");
  33. &self.0
  34. }
  35. }
  36. impl<T> DerefMut for MyBox<T> {
  37. fn deref_mut(&mut self) -> &mut Self::Target {
  38. println!("deref mut run .");
  39. &mut self.0
  40. }
  41. }
  42. fn f0(b: MyBox<[i32; 2]>) {
  43. println!("succ f0.")
  44. }
  45. fn f1(b: &MyBox<[i32; 2]>) {
  46. println!("succ f1.")
  47. }
  48. fn f2(b: &mut MyBox<[i32; 2]>) {
  49. println!("succ f2.")
  50. }
  51. fn f3(b: [i32; 2]) {
  52. println!("succ f3.")
  53. }
  54. fn f4(b: &[i32; 2]) {
  55. println!("succ f4.")
  56. }
  57. fn f5(b: &mut [i32; 2]) {
  58. println!("succ f5.")
  59. }
  60. //无法写出 大小在编译未知
  61. // // // fn f6(b: [i32]){
  62. // // println!("succ")
  63. // }
  64. fn f7(b: &[i32]) {
  65. println!("succ f7.")
  66. }
  67. fn f8(b: &mut [i32]) {
  68. println!("succ f8.")
  69. }
  70. trait ArrTrait {
  71. fn arr_f0(mut self) where Self: Sized {
  72. println!("test arr_f0.");
  73. }
  74. fn arr_f1(self) where Self: Sized {
  75. println!("test arr_f1.");
  76. }
  77. fn arr_f2(&mut self) where Self: Sized {
  78. println!("test arr_f2.");
  79. }
  80. fn arr_f3(&self) where Self: Sized {
  81. println!("test arr_f3.");
  82. }
  83. }
  84. trait UnsizeArrTrait {
  85. // 该处方法无法使用。因为[i32] 大小未知 无法通过编译
  86. // fn u_arr_f0(mut self: Self){
  87. // println!("u_arr_f0");
  88. // }
  89. // fn u_arr_f1(self){
  90. // println!("u_arr_f1");
  91. // }
  92. fn u_arr_f2(&mut self) {
  93. println!("u_arr_f2");
  94. }
  95. fn u_arr_f3(&self) {
  96. println!("u_arr_f3");
  97. }
  98. }
  99. impl ArrTrait for [i32; 2] {}
  100. impl UnsizeArrTrait for [i32] {}
  101. #[test]
  102. fn t() {
  103. let my_box = MyBox([3; 2]);
  104. // my_box.test();
  105. // 方法测试 自动添加&,* 减少工作量 mut 不属于类型一部分,只是修饰
  106. // my_box.test0(&3); 隐式转换.deref deref_mut &str
  107. MyTrait::test2(&my_box,&4);
  108. // my_box.test1(&3);
  109. // my_box.test2(&4); //自动给添加 &
  110. // my_box.test3(&3); //自动添加 &
  111. // (&my_box).test0(&3); // 自动加* 调用self
  112. // (&my_box).test1(&3); // 自动加 *
  113. // &my_box.test2(&3); //自动 归一化 一直到 只有一个 & .然后test2的&self ,然后直接调用。如果是
  114. // (&&&&&&&&&&&my_box).test3(&3); //归一化 变成&my_box 然后直接调用方法
  115. // -------------------------------------------------------------------------------
  116. // my_box.arr_f0();// 调用了my_box的deref ,然后进行了添加* 调用了arr_f0方法,
  117. // ArrTrait::arr_f0(*my_box)
  118. // 感觉&[i32;2]能调用arr_f0是因为该类型能copy,如果没有copy应该报错???
  119. // my_box.arr_f1();//和arr_f0同理
  120. // my_box.arr_f2();// 感觉mut 有传递性,arr_f2的第一个要mut,my_box也要mut 否则报错,
  121. // 调用了derefMut ,然后直接调用arr_f2方法
  122. // 这里rust 先调用了 my_box的deref 方法 返回了 里面的引用。类型是&[i32;2],然后刚刚好调用了arr_f0方法
  123. // my_box.arr_f3();
  124. // ------------------------------------------------------------------------
  125. // my_box.u_arr_f2();// 进行了my_box先调用 derefMut 得到&mut [i32;2] 然后进行了无大小类型转换得到 &[i32]
  126. // [i32;2] &[i32;2] *[i32;2]
  127. // [i32]
  128. // my_box.u_arr_f3();//与上同理
  129. // --------------------------------------------------------------------------------
  130. // f0(my_box);
  131. // f1(&my_box);// 需要手动加& ,rust不会自动添加
  132. // f2(&mut my_box);//rust 不会自动加&mut ,需要手动
  133. // f3(*my_box);//rust 不自动加*, 这里*的作用调用deref方法
  134. // f4(&my_box);// rust 对函数不自动加&,导致deref方法调用不了,手动加,隐式类型转换 调用deref方法
  135. // f5(&mut my_box); //rust不自动加& 而且这个函数需要mut , 如果是&my_box也不成功,
  136. // 因为不可变不可以调用可变的参数,这里调用了my_box的derefMut返回了可变&mut[i32;2] 函数参数匹配成功
  137. // f6(a); 无法使用 编译大小未知
  138. // f7(&my_box);//rust不自动添加&,导致deref不能调用,手动添加&,rust会隐式转换调用deref方法,返回&[i32;2]
  139. // 然后继续无大小类型转换 &[i32;2] 到&[i32] 函数参数匹配成功,调用函数成功
  140. // f8(&mut my_box); // rust不自动添加& ,就算添加,只能调用deref ,不能调用derefMut ,所以手动添加&mut ,
  141. //rust然后进行隐式类型转换,调用了derefMut方法,得到&mut [i32;2]类型。发现函数参数依旧不匹配成功。
  142. // 进行了无大小类型转换 &mut[i32;2] 得到&mut [i32] ,函数参数匹配成功,调用函数成功
  143. }

不太好说,b站有讲解:Rust方法自动解引用补充和总结(4)_哔哩哔哩_bilibili

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/121340
推荐阅读
  

闽ICP备14008679号