我想我在非常高的层次上理解Rust&和*Rust之间的区别,因为它与内存管理有关。
以下代码片段有什么区别。应用一种方法与另一种方法是否存在危险?
for (i, item) in bytes.iter().enumerate() {
if *item == b' ' {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
for (i, item) in bytes.iter().enumerate() {
if item == &b' ' {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
据我了解,当我返回一个值时,iter()我将返回对bytes. 如果我想对项目进行比较,我需要在两个引用之间进行比较,&u8或者我需要自己进行&item引用,以便在我调用item它时是 type u8,或者我需要item在比较时取消引用,以便item= &u8- > *item= u8。
当我使用 运行代码时(i, &item),当我item稍后调用时,这与第二个示例中的取消引用完全相同,还是编译器如何解释第一个代码片段和第二个代码片段存在根本差异?
第三个代码片段有什么问题吗?我意识到这是一个基于意见的问题。我意识到如果我要使用item(或*item,或将值分配为引用)将值分配给另一个变量,我稍后会返回不同的数据类型。除了管理您的数据类型之外,在考虑是否item == &b' '适合这项工作时,还有什么要记住的吗?
这些片段之间没有任何区别。它们生成完全相同的程序集:
pub fn a(bytes: &[u8]) -> usize {
for (i, item) in bytes.iter().enumerate() {
if *item == b' ' {
return i;
}
}
0
}
pub fn b(bytes: &[u8]) -> usize {
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
0
}
pub fn c(bytes: &[u8]) -> usize {
for (i, item) in bytes.iter().enumerate() {
if item == &b' ' {
return i;
}
}
0
}
Run Code Online (Sandbox Code Playgroud)
pub fn a(bytes: &[u8]) -> usize {
for (i, item) in bytes.iter().enumerate() {
if *item == b' ' {
return i;
}
}
0
}
pub fn b(bytes: &[u8]) -> usize {
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
0
}
pub fn c(bytes: &[u8]) -> usize {
for (i, item) in bytes.iter().enumerate() {
if item == &b' ' {
return i;
}
}
0
}
Run Code Online (Sandbox Code Playgroud)
对于它的价值,我将函数编写为
pub fn a(bytes: &[u8]) -> Option<usize> {
bytes.iter().position(|&b| b == b' ')
}
Run Code Online (Sandbox Code Playgroud)
iter()[...] 中找到的元素的引用bytes
是的,iter通常是一个返回引用迭代器的函数。
我需要比较
通常,您需要比较具有相同参考数量或有时具有一级参考差异的两个事物。您如何实现这一点并不重要——引用一个值或取消引用另一个值,或者通过*作为表达式或通过&模式取消引用。
也可以看看: