ΠΠ½Π°ΡΠΈΡ Π»ΠΈ ΡΡΠΎ, ΡΡΠΎ Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΠ΅ΠΊΡΡΡ Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ? Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ β Π΄Π°. ΠΠΎΠΊΠ° ΡΡΡ Π·Π°Π΄Π°ΡΡ ΡΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠΈΡΡ Π½Π°ΡΠ° ΡΡΠ°ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Π° ΠΏΠΎ-ΡΡΡΡΠΊΠΈ, Π° Π²ΠΎ-Π²ΡΠΎΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΏΡΠΈΠ·Π²Π°Π½Π½ΡΡ ΡΠ½ΠΈΠ·ΠΈΡΡ ΡΡΠ°Π²ΡΡΡ ΠΌΠ΅ΠΌΠΎΠΌ Β«ΠΡΡΡΡΡ ΠΊΡΠΈΠ²ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡΒ» (Steep learning curve). ΠΠ»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Ρ ΠΎΡΡ Π±Ρ Π² ΠΎΠ±ΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠ΅Π±Π΅, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΡΡΠ° ΠΈ ΡΡΠ΅ΠΊ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ. Π ΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΡΠ·ΡΠΊΠ°ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π’Π°ΠΊΠΆΠ΅ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ Π²ΡΡΡΠΈΡΡ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΡΡΠΈ ΠΏΡΠ½ΠΊΡΠ° ΠΏΡΠ°Π²ΠΈΠ» Π²Π»Π°Π΄Π΅Π½ΠΈΡ.
Π ΡΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°?
ΠΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ΄Π°ΡΡΠ΅Π΅ ΡΠ·ΡΠΊ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅. ΠΠΎΡΠ²ΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ³ΡΡ Π΅Π³ΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ.
ΠΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΡΠ³ΡΠ±Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΉ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠ°ΠΌΡΡΠΈ. Π’ΡΡ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ (Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°) Π½Π΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ, Π° Π·Π½Π°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠΈΠ²Π°ΡΡΡΡ, ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π±Π°ΡΠ΄Π°ΠΊ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ Π³ΠΎΠ½ΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ (Data Races), ΡΡΠΎ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ (Undefined Behaviour, Π΄Π°Π»Π΅Π΅ UB). ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΠΏΡΠΈΡΠΈΠ½Ρ UB β ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ.
Π‘ΡΡΠ»ΠΊΠΈ
Π ΡΠ΅Π»ΠΎΠΌ &ΡΡΡΠ»ΠΊΠΈ/*ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½ΡΠΆΠ½Ρ ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅: Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΊΡΡΠ΅ (ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΠ΅ΠΌΠ°), ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ°Π΄ΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π² ΡΡΠ΅ΠΊΠ΅.
Π Rust Π΅ΡΡΡ ΡΠΎΠ²Π½ΠΎ Π΄Π²Π° ΡΠΈΠΏΠ° ΡΡΡΠ»ΠΎΠΊ (ΠΏΡΠΎ ΡΡΡΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ):
- Π‘ΡΡΠ»ΠΊΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ (shared reference):
&lnk_name
β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅. - ΠΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ (ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠ΅) ΡΡΡΠ»ΠΊΠΈ:
&mut lnk_name
β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π΄Π°Π½Π½ΡΠ΅.
Π‘ΡΡΠ»ΠΊΠΈ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΡΡΡΡ Π΄Π²ΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ:
- Π‘ΡΡΠ»ΠΊΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΆΠΈΡΡ Π΄ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΡΡΡΠ»Π°ΡΡΡΡ (Rust Book ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠΎ ΡΠ°ΠΊ: Β«Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈΒ»).
- ΠΡΡΠ°Π±Π΅Π»ΡΠ½Π°Ρ ΡΡΡΠ»ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½Π° ΠΈΠ»ΠΈ, ΡΠΈΡΠΈΡΡΡ Rust Book: Β«Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π»ΠΈΠ±ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ ΡΡΡΠ»ΠΎΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, Π»ΠΈΠ±ΠΎ Π»ΡΠ±ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΡΡΡΠ»ΠΎΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Β». ΠΠ°Π±Π΅Π³Π°Ρ Π²ΠΏΠ΅ΡΠ΅Π΄: Π½Π° ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΡ ΡΡΡΠ»ΠΊΠ°Ρ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³. ΠΠ½Π³Π»ΠΈΡΠΈΠ·ΠΌ ΡΡΡ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠ° Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΡΡΠ»ΠΊΠΎΠΉ. ΠΡΠΎ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π½ΠΎ ΠΈ Π΄Π»Ρ Π²ΡΠ΅ΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ Π²Π΅ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅, ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½Π°Ρ ΡΡΡΠ»ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΈ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°Ρ , ΡΡΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Mutex.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Lifetime?
ΠΡΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΡΠ»ΠΎΠΊ: Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΆΠΈΡΡ Π΄ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΠΌ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π½ΠΈΡ , ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡ Π΄Π°Π΅Ρ ΡΠ·ΡΠΊ Rust Ρ ΠΏΠΎΠΌΠΎΡΡΡ Lifetime.
Lifetime β ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΡΡΠ»ΠΊΠΈ Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ. ΠΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΡΠΎΠΎΡΠ½ΠΎΡΡΡΡΡ Ρ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΎΡ ΠΏΡΡΠΌΠΎ ΡΠ°ΠΊ. ΠΠ΅ Π²ΡΠ΅ΠΌΡ β ΠΎΠ±Π»Π°ΡΡΡ ΠΊΠΎΠ΄Π°. ΠΠ»Ρ Π½Π°Ρ ΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΊΠΎΠ΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ. Lifetime β ΡΡΠΎ ΠΊΠ°ΠΊ ΠΈΠΌΡ ΡΠ°ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, ΡΠ°ΠΊ ΠΈ ΠΌΠ΅ΡΠΊΠ° Π΄Π»Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ ΡΡΠΎ.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ Π΅ΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Rust. ΠΠ±ΡΡΠ½ΠΎ Π² C-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ (ΡΠΊΡΠΏΠ΅ΡΡΡ ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ C/C++ ΠΏΠΎΠΏΡΠ°Π²ΡΡΠ΅, Π΅ΡΠ»ΠΈ ΡΡΠΎ). Π Π² Rust ΠΈ Π² Π‘/C++ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ Π±Π»ΠΎΠΊΠΎΠ² β{...}β, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Rust Π±Π»ΠΎΠΊ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠ°ΠΊ Β«Π΄ΠΎΠ»Π³ΠΎΒ» ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΏΡΠΎΠΆΠΈΠ²Π΅Ρ Π½Π° ΡΡΠ΅ΠΊΠ΅, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ C/C++, Π³Π΄Π΅ Π±Π»ΠΎΠΊ ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ.
ΠΠΎΠ·ΡΠΌΡΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
fn main() {
let num_ref;
{
let num = 4;
num_ref = #
} // ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ num Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Π°, Π²ΡΠΉΠ΄Ρ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ Π±Π»ΠΎΠΊΠ°.
// ΠΠ΄Π½Π°ΠΊΠΎ num_ref ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° Π΅Ρ Π°Π΄ΡΠ΅Ρ,
// Π½ΠΎ ΠΏΠΎΠΊΠ° Π²ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π½Π°Π»ΠΈΡΠΈΠ΅ Π²ΠΈΡΡΡΠ΅ΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
// Π° Π²ΠΎΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΡ ΡΡΡΠ»ΠΊΡ - ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ.Π΅. UB
println!("say number {}", *num_ref);
}
ΠΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΡΠΎΠ±ΡΠ°ΡΡ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ:

ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° C ΡΡΠΎ ΠΌΠΎΠ³Π»ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ, Π΅ΡΠ»ΠΈ Π±Ρ Rust Π½Π°Ρ Π½Π΅ Π·Π°ΡΠΈΡΠΈΠ».
Π C Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π°ΡΠ΅. Π’Π°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π° C Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π² ΡΠΈΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Ρ C Π½Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ· Π±Π»ΠΎΠΊΠ° Π²ΡΠΊΠΈΠ½ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΡΠ΅ΠΊΠ°. ΠΠΎΡΠΎΠΌΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π° C Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ. ΠΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π»ΠΈΠΊΠ²ΠΈΠ΄Π°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΡΡΠ΅ΠΊΠ΅ ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Rust ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ Π±Π»ΠΎΠΊΠ°.
#include "stdio.h"
int* get_num_ptr() {
int num = 4;
return #
}
int main() {
int* num_ref = get_num_ptr();
printf("say num: %d", *num_ref);
}
Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΠΌ:
gcc src/bin/lifetime_too_short.c -o lifetime_too_short_c && ./lifetime_too_short_c
ΠΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:

Borrow-checker ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Rust. GCC Π²ΠΈΠ΄ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π½ΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅Ρ ΠΊΠΎΠ΄. ΠΠ°Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΡΠΎΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΏΡΠΎΠΏΡΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ (clang ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΈ Π²ΠΎΠ²ΡΠ΅ ΡΠ±Π΅ΡΠ΅ΠΆΠ΅Ρ ΠΎΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ), ΠΎΠ΄Π½Π°ΠΊΠΎ C ΠΈ C++ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π·Π°ΡΠΈΡΠ°ΡΡ ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ ΡΠ·ΡΠΊΠ°. Π ΠΏΡΠΎΡΡΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, Π½ΠΎ Π½Π΅Ρ ΡΠ·ΡΠΊΠΎΠ²ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ±Π΅ΡΠ΅Π³ΡΡ Π½Π°Ρ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅. ΠΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΠ΄ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C++, Ρ ΠΎΡΡ Π΄Π°ΠΆΠ΅ Ρ Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΡΠ΅Π»ΠΈΡΡ ΡΠ΅Π±Π΅ ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ.
ΠΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³Π°
ΠΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π΅Π· ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ. ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΡ ΠΎΠ΄ΠΈΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠ΅ΠΌΡ.
ΠΠΎΠ·ΡΠΌΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· Rust Book:
fn big_problem() {
let mut s = String::from("hello");
let r1 = &s; // no problem
let r2 = &s; // no problem
let r3 = &mut s; // BIG PROBLEM
println!("{}, {}, and {}", r1, r2, r3);
}
ΠΠΈΠ΄Π½ΠΎ ΡΡΠΎ ΡΡΠΎ ΠΏΡΡΠΌΠΎΠ΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ» Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ. Rust Book Π²Π΅ΡΡΠΌΠ° Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΉ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³ ΡΡΠ°Π·ΠΎΠΉ: Β«ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ!Β» ΠΠ΄Π½Π°ΠΊΠΎ Π½Π° ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠΎ ΡΡΡΠ΅ΠΊΡ Π² Π³Π»Π°Π·Π° Π½Π΅ Π±ΡΠΎΡΠ°Π΅ΡΡΡ, Π½ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½Π°Ρ ΡΡΡΠ»ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ:
fn compute(input: &u32, output: &mut u32) {
if *input > 10 {
*output = 1;
}
if *input > 5 {
*output *= 2;
}
// ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ `output` == `2` Π΅ΡΠ»ΠΈ `input > 10`
}
ΠΡΠΈ Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΌ Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΌ β Π² output
Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ ΡΠΈΡΠ»ΠΎ 2:
let input = 20;
let mut output = 0;
compute(&input, &mut output); // Π² `output` ΠΏΠΎΠ»ΠΎΠΆΠΈΡ 2
ΠΠ΄Π½Π°ΠΊΠΎ Π² ΡΡΠ½ΠΊΡΠΈΠΈ compute()
Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ. Π§ΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΠΎΠΈΡ
Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΡΡΠΎΠΊ ΠΏΠ°ΠΌΡΡΠΈ?
let mut num = 20;
compute(&num, &mut num);
if
Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ input
ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ ΠΈ Π²ΡΠΎΡΠΎΠΉ Π±Π»ΠΎΠΊ if
ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ input
ΡΠΎΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΅ 5. ΠΡΠΎ ΠΈ Π±ΡΠ»ΠΎ Π½Π°Π·Π²Π°Π½ΠΎ Π² Rust Book Π²Π½Π΅Π·Π°ΠΏΠ½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠΈΠΊΠΎΠ²Π°Π½ΠΎ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΈ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°Π·Π½ΡΠ΅.ΠΠΎΠΊΠ° Π·Π΄Π΅ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π³Π»ΡΠ΄Π΅ΡΡ ΡΡΠΎ-ΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ°Π·ΡΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π΅ΡΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠ³ΡΡ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎ Π±Π»Π°Π³ΠΎ (Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠΎΡΠ½ΠΎ). ΠΠ»Ρ Π½Π°Ρ Π²Π°ΠΆΠ΅Π½ ΡΠ°ΠΊΡ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ·ΡΠΊΠΎΠ² Ρ ΠΈΡ Π»ΠΈΠ±Π΅ΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡ ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΉ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠΈΡ Π±Π»ΠΎΠΊΠΎΠ² Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ Π½Π° ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΉ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³. Π‘ΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π²Π½Π΅Π·Π°ΠΏΠ½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΡΡΡΠ»ΠΎΠΊ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²Π½Π΅Π·Π°ΠΏΠ½ΡΠΉ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
Rust ΡΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
- ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΠ² ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ;
- ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ Π±ΡΠ»Π° ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½Π° ΠΏΠ΅ΡΠ΅Π΄ Π΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ΠΌ;
- ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ Π±ΡΠ»Π° ΠΏΡΠΎΡΠΈΡΠ°Π½Π° ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΠΈΡΡΡ;
- ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΡΡ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ, Π½Π΅ Π±ΠΎΡΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°.
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°Π·ΠΈΡΡ ΡΠ°ΠΊ:
fn compute_on_stack(input: &u32, output: &mut u32) {
let mut cache = *output;
if *input > 10 {
cache = 1;
}
if *input > 5 {
cache *= 2;
}
*output = cache;
}
input
ΠΈ output
ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΡΠ°Π·Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ΅ ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠΏΠΈΠΈ Π΄Π°Π½Π½ΡΡ
Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠ΅ΡΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅. ΠΠΈΠ±Π΅ΡΠ°Π»ΡΠ½ΡΠ΅ C ΠΈ C++ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ΅Π±Π΅ Π½Π΅ ΠΌΠΎΠ³ΡΡ: Π²Π΄ΡΡΠ³ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ Π½Π° ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΉ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³.Lifetime ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊ ΠΈ ΠΊΠ°ΠΊ ΡΠΈΠΏ
ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅, lifetime β ΡΡΠΎ ΠΎΠ±Π»Π°ΡΡΡ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΆΠΈΠ²Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ/Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΡΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π·ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ Π²ΡΡΠ²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ. Π Rust Π² night-ΡΠ±ΠΎΡΠΊΠ°Ρ Π΄Π°ΠΆΠ΅ Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ lifetime-ΠΌΠ΅ΡΠΊΠΈ Π² Π±Π»ΠΎΠΊΠ°Ρ ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΠΎΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ Β«ΡΠ°ΡΡΠ°Ρ Π°ΡΠΈΠ²Π°ΡΡΒ» ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π² ΠΈΡΠΎΠ³Π΅.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΡ ΠΊΠΎΠ΄:
let x = 0;
let y = &x;
let z = &y;
ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°Π·ΠΈΡΡ ΡΠ°ΠΊ:
'a: {
let x: i32 = 0;
'b: {
let y: &'b i32 = &'b x;
'c: {
let z: &'c &'b i32 = &'c y;
}
}
}
Lifetime Π²ΡΠ΅Π³Π΄Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π°ΠΏΠΎΡΡΡΠΎΡ. Π‘Π°ΠΌΠ° ΠΌΠ΅ΡΠΊΠ° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΡ Π½Π°ΠΌ ΠΎΠ± ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°Ρ lifetime (Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ βstatic). ΠΠ»Ρ Π½Π°Ρ ΠΈΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΡΠ»ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠΌ ΡΠ°Π²Π΅Π½ΡΡΠ²Π° ΠΈΠ»ΠΈ Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ β Π·Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΡ Π±Π»ΠΎΠΊΠΎΠ² ΡΠ²Π½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΎΠΉ lifetime Π΄Π»ΠΈΠ½Π½Π΅Π΅.
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π±Π»ΠΎΠΊ Ρ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡΠΎΡΠΊΠΈΠΌ lifetime. ΠΠΎΡΡΠ΄ΠΎΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΡΠ΅ΠΊΠ΅ Π²Π°ΠΆΠ΅Π½ Π΄Π»Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΈΡ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΡΠΎΠΌΡ lifetime Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡΠ΄ΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½Π°ΡΠ΅:
let x = 0;
let z;
let y = &x;
z = y;
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΡΡΠ»ΠΊΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ scope Π·Π°ΡΡΠ°Π²ΠΈΡ Rust Π²ΡΠ²Π΅ΡΡΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΡΠ΅ lifetime:
'a: {
let x: i32 = 0;
'b: {
let z: &'b i32;
'c: {
// ΠΠ»Ρ &y ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ 'b Π²ΠΌΠ΅ΡΡΠΎ 'c
// ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ° ΡΡΡΠ»ΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π°
// Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ· scopa-Π° 'b
let y: &'b i32 = &'b x;
z = y;
}
}
}
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΡΡΡΠΊΡΡΡΡ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΡΡΠ»ΠΊΠΈ, ΠΈ ΡΠΎΠ³Π΄Π° ΠΈΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠ½ΡΠΉ Π²ΠΈΠ΄. ΠΠΌΡ lifetime Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΡΡΠ΅ΠΌΠ»Π΅ΠΌΡΠΌ Π²Ρ ΠΎΠ΄Π½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠ° ΠΊΠ°ΠΊ ΠΈ ΡΠΈΠΏΠΎΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ(Ρ) lifetime ΡΠ²Π½ΠΎ, ΠΎΠ½ΠΈ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄ΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° β&β.
fn as_str(data: &u32) -> &str {
let s = format!("{}", data);
&s
}
ΠΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°Π·ΠΈΡΡ ΡΠ°ΠΊ:
fn as_str<'a>(data: &'a u32) -> &'a str {
'b: {
let s = format!("{}", data);
return &'a s;
}
}

ΠΠΎΠΏΡΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅ΡΠ½ΡΡΡ ΡΡΡΠ»ΠΊΡ Ρ lifetime Π½Π΅ ΠΌΠ΅Π½ΡΡΠΈΠΌ ΡΠ΅ΠΌ Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ, Π² ΡΠ΅Π»ΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΆΠ΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ (ΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² Π΄Π΅ΡΠ°Π»ΡΡ ). ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π΄Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
fn to_string(data: &u32) -> String {
format!("{}", data)
}
String
Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΡΡΠ»ΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π½Π΅ Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°ΡΡΡΡ, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ, ΠΏΠΎ ΡΡΡΠΈ ΡΡΠΎ ΡΠΌΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ: Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ Π±Π΅Π· ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΠ»ΠΊΠΈ, Π° ΡΠ°ΠΌΠ° ΡΡΡΠΎΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π»Π΅ΠΆΠ°ΡΡ Π² ΠΊΡΡΠ΅.ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Β«ΡΠ°ΡΡΠ°Ρ Π°ΡΠΈΡΡΒ» Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΊΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π»ΠΈΠ°ΡΠΈΠ½Π³Π°:
let mut data = vec![1, 2, 3];
let x = &data[0];
data.push(4);
println!("{}", x);
x
β ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΠ°ΡΡΡ Π²Π΅ΠΊΡΠΎΡΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²Π΅ΠΊΡΠΎΡ β ΡΡΠΎ ΡΠΌΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΡΠΎ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π² ΠΊΡΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π²Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π½Π°Ρ ΠΈ Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΡΠ°ΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ°Π½ΡΡ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Ρ (ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ/ΠΈΠ»ΠΈ UB). ΠΠ΄Π½Π°ΠΊΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π½Π΅ Π½Π°Π΄ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π·Π½Π°ΡΡ ΠΏΡΠΎ ΡΠΎ, ΡΡΠΎ x
ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠ°ΡΡΡ Π²Π΅ΠΊΡΠΎΡΠ° ΠΈΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π²Π΅ΠΊΡΠΎΡ, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΎΠΏΠ΅ΡΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΠΊΡΡΠ΅. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ.ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ²Π΅Π΄Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΠ°Π·Ρ Π²ΠΈΠ΄Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ lifetime:
'a: {
let mut data: Vec<i32> = vec![1, 2, 3];
'b: {
// Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ x Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ lifetime 'b
// (ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΡΡΠΎΠΌ scope-Π΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ
// ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ x Π² println!)
let x: &'b i32 = Index::index::<'b>(&'b data, 0);
'c: {
Vec::push(&'c mut data, 4);
}
println!("{}", x);
}
}
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Rust Π²ΠΈΠ΄ΠΈΡ, ΡΡΠΎ x
Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠΆΠΈΡΡ Π²ΡΠ΅ΠΌΡ βb
, ΡΡΠΎΠ±Ρ Π±ΡΡΡ Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π½Π½ΡΠΌ Π² println!()
, ΡΡΠΎ ΠΈ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΎ Π² Π²ΡΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Index::index
, ΠΊΠΎΡΠΎΡΠ°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ lifetime βb
. ΠΠΈΠΆΠ΅ ΠΌΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°ΡΡ data
Ρ ΠΌΠ΅Π½ΡΡΠΈΠΌ lifetime, Π½Π° ΡΡΠΎ ΠΈ ΡΡΠ³Π°Π΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ. ΠΡΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ±ΡΠ°ΡΡ println!(β{}β, x)
, Π²ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΈΡΡΡΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ/ΡΡΡΠ»ΠΊΠ° β Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° β ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ ΡΠ²ΠΎΠΉ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ, Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ°ΡΡΠ΅.
ΠΠ°ΠΌΠ°Π»ΡΠΈΠ²Π°Π½ΠΈΠ΅ Lifetime (Elision)
ΠΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π²Π΅ΡΡΠΈΠΈ Rust 1.0 ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΎ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΡΠ²Π½ΠΎ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ lifetime. ΠΠΎΠ·Π΄Π½Π΅Π΅ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ Π²ΡΠ΅ Π·Π° Π½Π°Ρ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊΠΎΡΠΎΡΠ΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌΡΠΌΠΈ.
ΠΡΠ° ΡΠΈΡΠ° ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π·Π°ΠΌΠ°Π»ΡΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ lifetime ΠΈΠ»ΠΈ Elision. ΠΡΠΎ ΠΏΠ»ΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ lifetime ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΡΠΈΠ½Π³ΡΠ°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΆΠ΅ΡΡΠΊΠΈΠ΅ β ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» Π·Π½Π°ΡΡ ΠΈΡ Π½Π°ΠΈΠ·ΡΡΡΡ. Π Π΅ΡΡ ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² Rust Book ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΡΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠΎ Π΄ΠΎΡΠ°Π΄Π½ΠΎΠ΅ Π½Π΅Π΄ΠΎΡΠ°Π·ΡΠΌΠ΅Π½ΠΈΠ΅.
Lifetime ΠΌΠΎΠΆΠ΅Ρ Π²Ρ ΠΎΠ΄ΠΈΡΡ Π² ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΡΠ΅ΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
&'a T
β ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠ°T
.&'a mut T
β ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½Π°Ρ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡT
.T<'a>
β ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΠΈΠΏΠ° T Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡ ΠΈΠ»ΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΡΠ΅ΠΉΡΠΎΠ² ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΡΡΠ»ΠΊΠΈ.
Π’ΠΎ Π΅ΡΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ ΠΈ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ lifetime, ΡΡΠΎ Π±ΡΠ»ΠΎ Π²ΠΈΠ΄Π½ΠΎ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅. ΠΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΠΈΡ Π²Π·Π°ΠΈΠΌΠΎΡΠ²ΡΠ·ΠΈ. ΠΠ±ΡΠ°ΡΠ°Ρ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π·Π°ΠΌΠ°Π»ΡΠΈΠ²Π°Π΅ΠΌΡΡ (elided) lifetime, Π²Ρ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΡ ΡΠ²Π½ΠΎ.
ΠΡΠ°Π²ΠΈΠ»Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ (ΠΈΡ Π½Π°Π΄ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ):
- ΠΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΌΠ°Π»ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ (elided) lifetime Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½, Ρ.Π΅. Π² ΡΡΠ½ΠΊΡΠΈΠΈ
fn do_something(a: &str, b: &str)
Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²a
ΠΈb
Π±ΡΠ΄ΡΡ ΡΠ°Π·Π½ΡΠ΅ lifetime. - ΠΡΠ»ΠΈ Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΡΡΠ»ΠΎΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Ρ Π·Π°ΠΌΠ°Π»ΡΠΈΠ²Π°Π΅ΠΌΡΠΌ ΠΈΠ»ΠΈ ΡΠ²Π½ΡΠΌ lifetime, ΡΠΎ Π²ΡΠ΅ Π²ΡΡ
ΠΎΠ΄Π½ΡΠ΅ lifetime Π±ΡΠ΄ΡΡ Π΅ΠΌΡ ΡΠ°Π²Π½Ρ, Ρ.Π΅.
fn do_something(s: &βa str) -> (&βa str, &βa str)
Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π΅ΡΠ½Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΆ Ρ Π΄Π²ΡΠΌΡ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ, Π½ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ ΡΡΡΡΠΊΡΡΡΠ° Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΡΡΡΠ»ΠΎΡΠ½ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ - ΠΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ
&self
ΠΈΠ»ΠΈ&mut self
, ΡΠΎ Π²ΡΠ΅ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ Π·Π°ΠΌΠ°Π»ΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ lifetime Π±ΡΠ΄ΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½Ρ ΡΠ°Π²Π½ΡΠΌΠΈ lifetime ΡΡΡΠ»ΠΊΠΈ Π½Π°self
. - Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Rust Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ²Π΅ΡΡΠΈ lifetime ΠΈ Π·Π°ΡΡΠ°Π²ΠΈΡ Π²Π°Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ :
fn print(s: &str); // ΠΌΠΎΠ»ΡΠ° Π΄Π°
fn print<'a>(s: &'a str); // ΡΠ²Π½ΠΎ
fn debug(lvl: usize, s: &str); // ΠΌΠΎΠ»ΡΠ°
fn debug<'a>(lvl: usize, s: &'a str); // ΡΠ²Π½ΠΎ
fn substr(s: &str, until: usize) -> &str; // ΠΌΠΎΠ»ΡΠ°
fn substr<'a>(s: &'a str, until: usize) -> &'a str; // ΡΠ²Π½ΠΎ
fn get_str() -> &str; // ΡΠ°ΠΊ Π½Π΅Π»ΡΠ·Ρ
fn frob(s: &str, t: &str) -> &str; // ΡΠ°ΠΊ Π½Π΅Π»ΡΠ·Ρ
fn get_mut(&mut self) -> &mut T; // ΠΌΠΎΠ»ΡΠ°
fn get_mut<'a>(&'a mut self) -> &'a mut T; // ΡΠ²Π½ΠΎ
fn args<T: ToCStr>(&mut self, args: &[T]) -> &mut Command // ΠΌΠΎΠ»ΡΠ°
fn args<'a, 'b, T: ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command // ΡΠ²Π½ΠΎ
fn new(buf: &mut [u8]) -> BufWriter; // ΠΌΠΎΠ»ΡΠ°
fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> // ΡΠ²Π½ΠΎ
ΠΡΠ²ΠΎΠ΄
ΠΠ°ΡΠ°Π² ΡΠΈΡΠ°ΡΡ ΡΡΡ ΡΡΠ°ΡΡΡ, Π²Ρ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ° Π΄Π΅Π»Π΅ Π²ΡΠ΅ ΠΏΡΠΎΠ·Π°ΠΈΡΠ½ΠΎ: Π½Π°Π΄ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Rust, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠ³Π°ΡΡΠΈΠΉΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΊΠ°ΠΊ Π²Π΅Π»ΠΈΠΊΠΎΠ΅ Π±Π»Π°Π³ΠΎ. ΠΠ°, ΠΎΠ½ Π·Π°ΡΡΠ°Π²ΠΈΡ Π²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄, Π·Π°ΡΠΎ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π½Π΅ Π²ΡΡΡΡΠ΅Π»ΠΈΡ Π²Π°ΠΌ Π² Π½ΠΎΠ³Ρ, ΡΡΠΊΡ ΠΈΠ»ΠΈ Π² Π³ΠΎΠ»ΠΎΠ²Ρ 31 Π΄Π΅ΠΊΠ°Π±ΡΡ Π² 23:30 ΠΈ Π½Π΅ Π·Π°ΡΡΠ°Π²ΠΈΡ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΡΠ΅Π±Ρ Π² ΡΠ°ΠΌΠΎΠ΅ Π½Π΅ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ. Π ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π· ΠΌΡ Π·Π°Π³Π»ΡΠ½Π΅ΠΌ Π΅ΡΡ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠΆΠΊΠΎ ΠΏΡΠΈΠΎΡΠΊΡΠΎΠ΅ΠΌ ΡΠ°ΠΉΠ½Ρ, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π΅Π»Π°Π΅Ρ ΠΌΠ°Π³ΠΈΡ Π²Π»Π°Π΄Π΅Π½ΠΈΡ. ΠΠ° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΠΎΡΡΠ°Π»ΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΠ΅ΠΌΡ, ΠΊΠ°ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΠΊΡΡΠ΅ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΈΡ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ Π½Π° ΡΡΠ΅ΠΊΠ΅.
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ