Box<T>

Box β€” Ρ†Π΅ Π²ΠΊΠ°Π·Ρ–Π²Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Ρ– Π² ΠΊΡƒΠΏΡ–:

fn main() {
    let five = Box::new(5);
    println!("five: {}", *five);
}
5StackHeapfive

Box<T> Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ” Deref<Target = T>, Ρ‰ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Ρ”, Ρ‰ΠΎ Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠΊΠ»ΠΈΠΊΠ°Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π· T Π±Π΅Π·ΠΏΠΎΡΠ΅Ρ€Π΅Π΄Π½ΡŒΠΎ Π½Π° Box<T>.

РСкурсивні Ρ‚ΠΈΠΏΠΈ Π΄Π°Π½ΠΈΡ… Π°Π±ΠΎ Ρ‚ΠΈΠΏΠΈ Π΄Π°Π½ΠΈΡ… Π· Π΄ΠΈΠ½Π°ΠΌΡ–Ρ‡Π½ΠΈΠΌ Ρ€ΠΎΠ·ΠΌΡ–Ρ€ΠΎΠΌ Π½Π΅ ΠΌΠΎΠΆΡƒΡ‚ΡŒ збСрігатися Π²Π±ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠΌΠΈ Π±Π΅Π· пСрСнаправлСння Π²ΠΊΠ°Π·Ρ–Π²Π½ΠΈΠΊΠ°. Box Π·Π΄Ρ–ΠΉΡΠ½ΡŽΡ” Ρ†ΡŽ ΠΎΠΏΠΎΡΠ΅Ρ€Π΅Π΄ΠΊΠΎΠ²Π°Π½Ρ–ΡΡ‚ΡŒ:

#[derive(Debug)]
enum List<T> {
    /// НСпороТній список: ΠΏΠ΅Ρ€ΡˆΠΈΠΉ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Ρ‚Π° Ρ€Π΅ΡˆΡ‚Π° списку.
    Element(T, Box<List<T>>),
    /// ΠŸΠΎΡ€ΠΎΠΆΠ½Ρ–ΠΉ список.
    Nil,
}

fn main() {
    let list: List<i32> =
        List::Element(1, Box::new(List::Element(2, Box::new(List::Nil))));
    println!("{list:?}");
}
listElement1Element2NilΠ‘Π΅Ρ‚ΠΊΠšΠΏΡƒΠ°
This slide should take about 8 minutes.
  • Box схоТий Π½Π° std::unique_ptr Ρƒ C++, Π·Π° винятком Ρ‚ΠΎΠ³ΠΎ, Ρ‰ΠΎ Π²Ρ–Π½ Π³Π°Ρ€Π°Π½Ρ‚ΠΎΠ²Π°Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅ null.

  • Box ΠΌΠΎΠΆΠ΅ Π±ΡƒΡ‚ΠΈ корисним, ΠΊΠΎΠ»ΠΈ Π²ΠΈ:

    • ΠΌΠ°Ρ”Ρ‚Π΅ Ρ‚ΠΈΠΏ, Ρ€ΠΎΠ·ΠΌΡ–Ρ€ якого Π½Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡƒΡ‚ΠΈ Π²Ρ–Π΄ΠΎΠΌΠΈΠΉ ΠΏΡ–Π΄ час компіляції, Π°Π»Π΅ компілятор Rust Ρ…ΠΎΡ‡Π΅ Π·Π½Π°Ρ‚ΠΈ Ρ‚ΠΎΡ‡Π½ΠΈΠΉ Ρ€ΠΎΠ·ΠΌΡ–Ρ€.
    • Ρ…ΠΎΡ‡Π΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΠΈ володіння Π½Π° Π²Π΅Π»ΠΈΠΊΠΈΠΉ обсяг Π΄Π°Π½ΠΈΡ…. Π©ΠΎΠ± ΡƒΠ½ΠΈΠΊΠ½ΡƒΡ‚ΠΈ ΠΊΠΎΠΏΡ–ΡŽΠ²Π°Π½Π½Ρ Π²Π΅Π»ΠΈΠΊΠΈΡ… обсягів Π΄Π°Π½ΠΈΡ… Ρƒ стСку, Π½Π°Ρ‚ΠΎΠΌΡ–ΡΡ‚ΡŒ Π·Π±Π΅Ρ€Ρ–Π³Π°ΠΉΡ‚Π΅ Π΄Π°Π½Ρ– Π² ΠΊΡƒΠΏΡ– Π² Box, Ρ‰ΠΎΠ± пСрСміщувався лишС Π²ΠΊΠ°Π·Ρ–Π²Π½ΠΈΠΊ.
  • Π―ΠΊΡ‰ΠΎ Π±ΠΈ Box Π½Π΅ використовувався, Ρ– ΠΌΠΈ намагалися вставити List Π±Π΅Π·ΠΏΠΎΡΠ΅Ρ€Π΅Π΄Π½ΡŒΠΎ Π² List, компілятор Π½Π΅ Π·ΠΌΡ–Π³ Π±ΠΈ обчислити фіксований Ρ€ΠΎΠ·ΠΌΡ–Ρ€ структури Π² пам’яті (List ΠΌΠ°Π² Π±ΠΈ нСскінчСнний Ρ€ΠΎΠ·ΠΌΡ–Ρ€).

  • Box Π²ΠΈΡ€Ρ–ΡˆΡƒΡ” Ρ†ΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΡΠΊΡ–Π»ΡŒΠΊΠΈ ΠΌΠ°Ρ” Ρ‚ΠΎΠΉ самий Ρ€ΠΎΠ·ΠΌΡ–Ρ€, Ρ‰ΠΎ ΠΉ Π·Π²ΠΈΡ‡Π°ΠΉΠ½ΠΈΠΉ Π²ΠΊΠ°Π·Ρ–Π²Π½ΠΈΠΊ, Ρ– лишС Π²ΠΊΠ°Π·ΡƒΡ” Π½Π° наступний Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ List Ρƒ ΠΊΡƒΠΏΡ–.

  • Π’ΠΈΠ΄Π°Π»Ρ–Ρ‚ΡŒ Box Ρƒ Π²ΠΈΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ– списку Ρ‚Π° Π²Ρ–Π΄ΠΎΠ±Ρ€Π°Π·Ρ–Ρ‚ΡŒ ΠΏΠΎΠΌΠΈΠ»ΠΊΡƒ компілятора. Ми ΠΎΡ‚Ρ€ΠΈΠΌΠ°Ρ”ΠΌΠΎ повідомлСння β€œrecursive without indirection”, Ρ‚ΠΎΠΌΡƒ Ρ‰ΠΎ для рСкурсії Π΄Π°Π½ΠΈΡ… ΠΌΠΈ ΠΏΠΎΠ²ΠΈΠ½Π½Ρ– використовувати посСрСдництво, Box Π°Π±ΠΎ якСсь посилання, Π·Π°ΠΌΡ–ΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‰ΠΎΠ± Π·Π±Π΅Ρ€Ρ–Π³Π°Ρ‚ΠΈ значСння Π±Π΅Π·ΠΏΠΎΡΠ΅Ρ€Π΅Π΄Π½ΡŒΠΎ.

  • Π₯ΠΎΡ‡Π° Box виглядає як std::unique_ptr Ρƒ C++, Π²Ρ–Π½ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡƒΡ‚ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ½Ρ–ΠΌ/Π½ΡƒΠ»ΡŒΠΎΠ²ΠΈΠΌ. Π¦Π΅ Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ Box ΠΎΠ΄Π½ΠΈΠΌ Π· Ρ‚ΠΈΠΏΡ–Π², які Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ΡŒ компілятору ΠΎΠΏΡ‚ΠΈΠΌΡ–Π·ΡƒΠ²Π°Ρ‚ΠΈ збСрігання дСяких ΠΏΠ΅Ρ€Π΅Π»Ρ–ΠΊΡ–Π² (β€œΠ½Ρ–ΡˆΠΎΠ²Π° оптимізація”).