Když si například napíšu:
fn main() {
let mut a = [1,2,3,4,5,6];
let mut b = &a[3..4];
b[1] = 10;
}
tak kompilátor zařve, že cannot assign to immutable indexed content `b[..]`
Není to moc jasné - a je mutable, b je (asi) mutable reference na slice, tak proč nemůžu přes b změnit prvek v a? Podle https://www.root.cz/clanky/prace-s-poli-v-programovacim-jazyku-rust/#k06 je slice stejně jen ukazatel + délka a v céčku něco podobného udělat jde prakticky stejně (kromě délky).
Problém je v tom, co je vlastně na let mut b = &a[..]
mutabilní. b je zde mutabilní proměnná držící typ &[i32]
, tedy nemutabilní referenci na řez polem. Takže b můžeme přiřadit jakoukoliv jinou hodnotu typu &[i32]
, ale nemáme mutabilní přístup k hodnotám pole.
let mut b = &a[2..6];
println!("{:?}", b); // [2, 3, 4, 5]
b = &b[1..];
println!("{:?}", b); // [3, 4, 5];
Naproti tomu let b = &mut a[2..6]
nabízí řez polem s mutabilním přístupem, ale samotné proměnné b nelze přiřadit jinou hodnotu typu &mut [i32]
.
let mut a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
{
let b = &mut a[2..6];
b[2] = 0;
println!("{:?}", b); // [2, 3, 0, 5]
}
println!("{:?}", a); // [0, 1, 2, 3, 0, 5, 6, 7, 8, 9]
aha, takže let mut b ... znamená jen to, že do toho b můžu později přiřadit jiný slice, vůbec to nesouvisí s tím, co přiřazuji?
Jinak díky, takto to valí (v předchozím příkladu byla chyba a[3..4] vrací jednoprvkový slice, takže žádné b[1] neexistuje, sorry)
fn main() {
let mut a = [1,2,3,4,5,6];
let mut b = &mut a[3..5];
b[1] = 10;
for i in b.iter() {
println!("{}", i);
}
}