Box<T>
Box
β ΡΠ΅ Π²ΠΊΠ°Π·ΡΠ²Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Ρ Π² ΠΊΡΠΏΡ:
fn main() { let five = Box::new(5); println!("five: {}", *five); }
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:?}"); }
-
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
ΠΎΠ΄Π½ΠΈΠΌ Π· ΡΠΈΠΏΡΠ², ΡΠΊΡ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡΡΡ ΠΊΠΎΠΌΠΏΡΠ»ΡΡΠΎΡΡ ΠΎΠΏΡΠΈΠΌΡΠ·ΡΠ²Π°ΡΠΈ Π·Π±Π΅ΡΡΠ³Π°Π½Π½Ρ Π΄Π΅ΡΠΊΠΈΡ ΠΏΠ΅ΡΠ΅Π»ΡΠΊΡΠ² (βΠ½ΡΡΠΎΠ²Π° ΠΎΠΏΡΠΈΠΌΡΠ·Π°ΡΡΡβ).