Pointers 不了解如何访问Rust中向量的元素

Pointers 不了解如何访问Rust中向量的元素,pointers,vector,reference,rust,Pointers,Vector,Reference,Rust,这是我第一次接触到锈菌,我正在阅读当前版本中关于向量的章节。我以前确实有使用其他语言的经验(主要是函数式语言,其中隐藏了以下问题) 运行以下代码段(从书中)返回3: fn main() { let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; println!("{}", third); } 我不明白的第一件事是为什么println中的第三个宏未被引用。我希望上面的代码打印v的第三个元素的内存地址(如在C和C++

这是我第一次接触到锈菌,我正在阅读当前版本中关于向量的章节。我以前确实有使用其他语言的经验(主要是函数式语言,其中隐藏了以下问题)

运行以下代码段(从书中)返回
3

fn main() {
  let v = vec![1, 2, 3, 4, 5];
  let third: &i32 = &v[2];
  println!("{}", third);
}
  • 我不明白的第一件事是为什么
    println中的
    第三个
    宏未被引用。我希望上面的代码打印
    v
    的第三个元素的内存地址(如在C和C++中),而不是它的内容
  • 现在考虑代码(注意这次在
    println!
    中的引用):

  • 为什么上面的代码与上面的代码产生完全相同的输出,就好像
    *
    没有任何区别一样
  • 最后,让我们重写上述代码片段,完全消除引用:

    fn main() {
      let v = vec![1, 2, 3, 4, 5];
      let third: i32 = v[2];
      println!("{}", third);
    }
    
  • 为什么最后一个版本的输出与前两个版本相同?那么
    v[2]
    真正有什么类型:是
    &i32
    还是
    i32
  • 以上所有这些都是前一章中仅提及一次的自动解引用的表现吗?(如果是这样,那么这本书应该重写,因为它比澄清更让人困惑。)

    免责声明:我也在学习生锈,所以请对此持保留态度

    要了解发生了什么,可能更容易理解

    对于代码

    fn main() {
      let v = vec![1, 2, 3, 4, 5];
      let third: &i32 = &v[2];
      println!("{}", third);
    }
    
    我们得到(我删除了不相关的代码)

    对于第一个/最后一个案例,以及

    fn main() {
        ...
        let third: ...
        {
            ::io::_print(::std::fmt::Arguments::new_v1_formatted(                            
                ...
                &match (&*third,) {                                                           
                    (arg0,) => [::std::fmt::ArgumentV1::new(arg0, ::std::fmt::Display::fmt)],
                },
                ...
            ));
        };
    }
    
    第二种情况

    这大致意味着,对于
    {}
    格式化程序,将调用函数
    fmt
    (trait
    Display
    )分别作为对
    third
    *third
    的引用

    让我们将此逻辑应用于

    • 第二种情况:
      third:&i32
      然后
      *third:i32
      ,这是适用的情况

    • 第一种情况:
      third:&i32
      ,这也是因为(其中
      T
      i32

    • 最后一种情况:
      third:i32
      :与第一种情况相同。此外,
      v[2]
      (类型为
      i32
      )之所以有效,是因为(注意:
      let third=v[2]
      之所以有效,是因为复制语义应用于
      =
      ,而不是默认的移动语义)


    如果您想知道类型,可以指定
    ()
    作为类型并研究错误消息,即
    让第三个:()=v[2]。是否有可能使其失效?
    
    fn main() {
        ...
        let third: ...
        {
            ::io::_print(::std::fmt::Arguments::new_v1_formatted(                            
                ...
                &match (&third,) {                                                           
                    (arg0,) => [::std::fmt::ArgumentV1::new(arg0, ::std::fmt::Display::fmt)],
                },
                ...
            ));
        };
    }
    
    fn main() {
        ...
        let third: ...
        {
            ::io::_print(::std::fmt::Arguments::new_v1_formatted(                            
                ...
                &match (&*third,) {                                                           
                    (arg0,) => [::std::fmt::ArgumentV1::new(arg0, ::std::fmt::Display::fmt)],
                },
                ...
            ));
        };
    }