CodeBlanks Logo Icon CodeBlanks

Cell<T>

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 false

Uygulama 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

main.rs
use std::cell::Cell;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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&lt;String&gt;</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

Soru
fn artir(&self) {
    self.n.____(self.n.get() + 1);
}
Cevap
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

Orta seviye bölümündeki tüm dersler