Guest User

Untitled

a guest
Apr 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. fn double(xs: &mut [u64]) {
  2. for x in xs {
  3. *x *= 2;
  4. }
  5. }
  6.  
  7. fn fib(n: i32) -> u64 {
  8. if n <= 1 {
  9. return 1;
  10. }
  11. fib(n-1) + fib(n-2)
  12. }
  13.  
  14. #[derive(Debug)]
  15. struct P {
  16. x: i32,
  17. y: i32,
  18. }
  19.  
  20. impl P {
  21. pub fn new() -> P {
  22. P { x: 0, y: 0 }
  23. }
  24.  
  25. fn update_x(&mut self) {
  26. self.x += 1;
  27. }
  28.  
  29. fn double(&self, i: &mut i32) {
  30. *i *= 2;
  31. }
  32.  
  33. fn update(&mut self) {
  34. self.update_x();
  35. self.update_x();
  36.  
  37. let mut i = &mut self.x;
  38. // ^^^ ここでmutable borrowしている
  39. // vvv ここでimmutable borrowだめでしょ
  40. self.double(i);
  41.  
  42. /*
  43. borrow規約
  44. - リソース渡しすると、所有権が移る
  45. - borrowのスコープは、所有者よりも短くないとダメ
  46. - なんなら {}で囲む
  47. - 以下は **排他**
  48. - 1以上のimmutable borrow (let x = &T)
  49. - ただ1つのmutable borrrow (let y = &mut T)
  50. */
  51. }
  52. }
  53.  
  54. fn main() {
  55. /*
  56. {
  57. let mut a = vec![1, 2, 3];
  58. println!("{:?}", a);
  59.  
  60. for _i in 0..20 {
  61. double(&mut a);
  62. println!("{:?}", a);
  63. }
  64. }
  65. {
  66. for n in 0..20 {
  67. println!("{}: {}", n, fib(n));
  68. }
  69. }
  70. */
  71. {
  72. let a = (1..10).collect::<Vec<i32>>();
  73. println!("{:?}", a);
  74. }
  75.  
  76. {
  77. let mut p = P::new();
  78. println!("{:?}", p);
  79.  
  80. p.update();
  81. println!("{:?}", p);
  82. }
  83. }
Add Comment
Please, Sign In to add comment