Cell<T>
- Rust kursu
- Orta seviye
- Ders 39/115
- 4 dk
Cell<T> ile kopyalanan türlerde iç değiştirilebilirlik öğrenirsin.
Cell<T>
Cell<T>, iç değiştirilebilirliğin en hafif biçimidir. Referans vermez; değeri bütün olarak alır (get, yalnızca Copy türler) ya da yerine koyar (set, replace). Ödünç sayımı olmadığı için hiç panic vermez:
use std::cell::Cell;
struct Sayac {
n: Cell<u32>,
}
impl Sayac {
fn artir(&self) { // &self yeterli!
self.n.set(self.n.get() + 1);
}
}Cell mi RefCell mi?
Küçük Copy değerler (sayaçlar, bayraklar) için Cell daha ucuz ve güvenlidir. İçerideki değere referans gerekiyorsa (vektöre eleman eklemek, String'i düzenlemek) RefCell gerekir:
let bayrak = Cell::new(false);
bayrak.set(true);
let eski = bayrak.replace(false); // true döner
println!("{} {}", eski, bayrak.get()); // true falseUygulama Cell ile sayaç
Yukarıdaki Sayac türünü Cell<u32> ile yaz. let s = Sayac { n: Cell::new(0) }; (mut olmadan) için artir'ı üç kez çağır ve değeri yazdır.
Başlangıç kodu
use std::cell::Cell;
fn main() {
// buraya yaz
}Örnek çözüm
use std::cell::Cell;
struct Sayac {
n: Cell<u32>,
}
impl Sayac {
fn artir(&self) {
self.n.set(self.n.get() + 1);
}
}
fn main() {
let s = Sayac { n: Cell::new(0) };
s.artir();
s.artir();
s.artir();
println!("{}", s.n.get());
}Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>Cell<String></code> üzerinde <code>get()</code> çağrılabilir mi?
- Evet, referans döner
- Panic verir
- Hayır; get yalnızca Copy türler için var. take() ya da replace() kullanılır Doğru cevap
- Evet, kopya döner
Açıklama: Cell referans veremediği için Copy olmayan değeri ancak yerine başka değer koyarak dışarı alabilirsin.
2 Değeri yerleştir
fn artir(&self) {
self.n.____(self.n.get() + 1);
}
fn artir(&self) {
self.n.set(self.n.get() + 1);
}
Açıklama: Cell::set yeni değeri yerine koyar.
3 Yöntem ve işi
| Kavram | Anlamı |
|---|---|
get() |
Kopyasını verir |
set(x) |
Yerine koyar |
replace(x) |
Eskiyi döndürür |
take() |
Varsayılanı bırakır |