我正在瀏覽“Rust Book”網站,以便為即將到來的作業面試學習語言。在關于向量的章節中,有兩個代碼示例:
fn main() {
let v = vec![100, 32, 57];
for i in &v {
println!("{}", i);
}
}
和:
fn main() {
let mut v = vec![100, 32, 57];
for i in &mut v {
*i = 50;
}
}
現在我想知道,為什么對于第一個樣本,當我們將對向量元素i的參考傳遞到:
println!("{}", i);
但是在我們向向量的每個元素添加 50 的示例中,我們必須在添加到 50 之前用 * 取消參考該元素?
為什么我們不能/不能做以下事情:
fn main() {
let v = vec![100, 32, 57];
for i in &v {
println!("{}", *i); // why don't we have to dereference before we pass to println!?
}
}
或者:
fn main() {
let mut v = vec![100, 32, 57];
for i in &mut v {
i = 50; // why can't we just add directly to the reference like this?
}
}
我一定誤解了我讀到的內容,但我認為 Rust 能夠辨別何時需要或不自動取消參考。我想我不明白為什么我們需要在兩個樣本中取消參考(或不取消參考)。我提供的兩個示例用我想知道的特定代碼位進行了注釋。
uj5u.com熱心網友回復:
我認為看這個的最簡單的方法是第二個例子是“正常”的例子。
fn main() {
let mut v = vec![100, 32, 57];
for i in &mut v {
*i = 50;
}
}
i
是 a &mut i32
(只是i32
因為沒有任何東西可以從中推斷出任何其他整數型別),因此要分配給它,您需要取消對 a 的參考mut i32
。
這個println!
例子是做一些“魔術”的人。println!
將格式化型別,無論它們是按值傳遞還是通過參考傳遞。這非常方便,您不希望它(例如)克隆您要列印的每個字串,但稍后在應用程式中使用。
編輯:
為了完整起見,這個“魔法”根本不是真正的魔法,而是很好地使用了語言特性。println!
(與其他所有進行格式化的標準宏一樣,例如panic!
和format!
)使用標準庫中的格式化機制。這可以適用于任何實作Display
trait 的型別(或者Debug
如果你使用 trait的話{:?}
)。并且對工具的所有參考Display
都有一個全面的 implDisplay
(Debug
也這樣做):
impl<'_, T> Display for &'_ T where
T: Display ?Sized,
{ /* ... */ }
因此,您可以使用值格式化任何內容,也可以使用參考進行格式化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462786.html