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
(traitDisplay
)分别作为对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)],
},
...
));
};
}