Rust komandas 2026. gada mērķu sarakstā ir apstiprināts priekšlikums, kas galu galā izmestu Pin. Mērķa nosaukums ir “Immobile types and guaranteed destructors”, statuss ir Accepted, termiņš ir 2026. un 2027. gads. Kontaktpersona ir lcnr, valodas komandas aizbildnis ir jackh726.
Priekšlikums ievieš trīs jaunas automātiskās iezīmes: Move, Destruct un Forget. Tās apraksta, ko ar tipu vispār drīkst darīt. Līdz šim Rust pieņēma, ka jebkuru vērtību var pārvietot atmiņā un ka to var aizmirst ar mem::forget, neizpildot destruktoru. Piešķire vērtību pārvieto. mem::forget ir droša funkcija. Daļai tipu neder ne viens, ne otrs pieņēmums.
Pin nekustīgumu piesien nepareizajai lietai
Pašreizējais risinājums pašatsauču tipiem ir Pin. Tas nekustīgumu piesien vietai atmiņā, kur vērtība atrodas. Tipa parakstā par to nav ne vārda. No tā izriet divkāršošanās, ko Yosh Wuyts sauc par pina dublēto definīciju problēmu: bibliotēkai blakus Trait nākas turēt arī PinnedTrait variantu.
Skaidrākais piemērs nāk no Linux kodola. Rust for Linux apraksts The Safe Pinned Initialization Problem paskaidro, kāpēc ListHead un Mutex<T> nevar inicializēt parastajā veidā: struktūrai jāzina sava adrese, pirms tā ir inicializēta. Pin<Box<T>> neļauj objektu pārvietot, taču inicializācijas paradoksu neatrisina. Kodola kods tāpēc lieto divu funkciju gājienu. Nedroša new() izveido neinicializētu vērtību. Pēc piesaistes atmiņā seko nedroša init(self: Pin<&mut Self>). Katra struktūra, kas satur ListHead vai Mutex<T>, šo ķēdi raksta pati no jauna.
Move, Destruct un Forget
Jaunais dizains sāk ar tipu bez īpašām spējām un pievieno tās pa vienai.
Move: tipu var pārvietot atmiņā.Destruct: tipu var netieši nomest, tas ir, destruktors izpildās, izejot no tvēruma.Forget: tipu var aizmirst armem::forget, neizpildot destruktoru.
Kompilatorā iezīme izskatās šādi: #[lang = "move"] unsafe auto trait Move {}. Pēc noklusējuma visi tipi to ievieš, tāpēc esošais kods uzvedas kā līdz šim. Tips, kas raksta !Move, saglabā stabilu adresi līdz pat brīdim, kad ir beidzis nomesties. Konstruēšana balstīsies uz atsevišķu darbu par inicializāciju uz vietas, jo !Move vērtību nevar izkopēt ārā no funkcijas. Tā vietā funkcija raksta datus izejas rādītājā.
Mērķa autori atsevišķi piebilst, ka Move nebūs Destruct virsiezīme. Pašatsauču tipam var būt vajadzīga sakopšana arī tad, kad pārvietot to nedrīkst. Paraugu visai konstrukcijai dod Sized hierarhijas darbs, kas atkāpās no pieņēmuma, ka visiem tipiem kompilēšanas laikā ir zināms izmērs.
!Forget dod drošu scoped spawn
Otra mērķa puse ir garantēti destruktori. Transaction tipam pirms sakopšanas jāizsauc commit() vai rollback(). Tvēruma uzdevuma rokturim jāpievienojas atpakaļ, pirms tvērums beidzas. Tā kā mem::forget ir droša, valoda šobrīd nevar apsolīt, ka destruktors nostrādās.
Ja rokturi varētu aizmirst ar mem::forget, uzdevums varētu pārdzīvot savu tvērumu un piekļūt karājošām atsaucēm. Ar !Forget rokturja destruktors izpildās garantēti.
Tā mērķa dokumentā ir aprakstīts drošs scoped spawn asinhronajam kodam. Rokturis savā destruktorā pievienojas uzdevumam. Aizmirst rokturi nav iespējams, tāpēc pievienošanās notiek vienmēr. Šobrīd šo shēmu drošajā Rust uzrakstīt nevar.
Gada mērķi pusgada vietā
Mērķis nāk no jaunas kārtības. RFC 3935 ar sākuma datumu 2026. gada 23. februāris pārslēdza Rust no pusgada mērķu periodiem uz gada periodiem. Argumentu formulē pats dokuments: gada mērķi dod vairāk laika apspriešanai un organizēšanai. Jaunus mērķus gada laikā drīkst pievienot tikai tad, kad visi resursi jau ir zināmi, tostarp aizbildnis komandā un finansējums.
Priekšlikumus vāca janvārī, februārī ar komandām pārrunāja RFC alfa versiju. Komandas pārbauda, vai mērķis ir reāls un vai tam ir aizbildnis. Nekustīgo tipu mērķis vienlaikus pieder divām daudzgadu ceļa kartēm: “Just add async” un “Rust for Linux”. Sarunas notiek Zulip kanālā #t-lang/move-trait, mērķa sekošanas pieteikums rust-lang/rust-project-goals#635 ir atvērts kopš 2026. gada 5. maija.
Kas dara darbu un kas paliek ārpus
Kompilatora ieviešanu uzņēmušies lcnr un nia-e. RFC rakstīs yoshuawuyts, viņam arī jāpierāda, ka ģeneratoru efektus var izvērst uz impl Trait + !Move, lai tie spētu nest pašatsauces. BennoLossin iezīmi pārbaudīs Linux kodolā, kur pašatsauču struktūru ir daudz. nikomatsakis pēta garantēto destruktoru dizainu, tostarp iezīmju hierarhijas variantus. Abas iesaistītās komandas, lang un types, atbalstu pieteikušas līmenī “Large”, kas nozīmē atsevišķu dizaina sesiju un dalību pārskatīšanā.
Future iezīme šogad netiek aiztikta. Tā ir vienīgā stabilā Rust iezīme ar atkarību no Pin. Migrācijai uz Move vajadzētu savu stāstu, bet Future problēmas ar to nebeidzas: mērķa dokuments min vēl aptuveni 10 atvērtus jautājumus, tāpēc Future pārstrāde tiek atlikta uz atsevišķu projektu.
Iezīme tiek pozicionēta kā pretpiedāvājums 2025. gada otrās puses mērķim par pina ergonomiku, kas gribēja pievienot valodai &pin mut x tipa formas un vienreizēju Drop pārslodzi. Argumentu autori formulē tiešā tekstā. Rust apņemas saglabāt savietojamību uz mūžu, tāpēc pin kā valodas elements būtu jāuztur mūžīgi, bet gala mērķis ir Pin no Rust izņemt.
Ātrdarbība bija galvenās bažas. lcnr eksperimentālais ātrdarbības tests ar atzīmi DO NOT MERGE aizskāra 18 failus, pievienoja 174 rindas un noņēma 50. Sapludināts tas netika. Pēc mērījumiem autori secina, ka regresijas ir pārvaldāmas.
Sekošanas pieteikums rust-lang/rust#149607 ir atvērts kopš 2025. gada 14. oktobra un tajā ir četri komentāri. No septiņiem soļiem ceļā uz stabilizāciju izpildīts ir viens: valodas komanda eksperimentu ir apstiprinājusi. Funkcijas vārtu nosaukuma vietā dokumentā joprojām stāv TODO.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.