
Rust və Parse, don't validate: yoxlamanı tipə çevirmək
Eli Bendersky Parse, don't validate fikrini Rust üçün yenidən incələyir: şərti yoxlayıb ona güvənmək əvəzinə, məlumatı zəmanəti poza bilməyən bir tipə çevirmək lazımdır.
Eli Bendersky bloqunda Alexis King-in 2019-cu il məqaləsindəki fikri yenidən gündəmə gətirən esse dərc edib. Haskell üçün yazılmış orijinal mətndə deyilir ki, kod şərti sadəcə yoxlayıb sonra ona güvənməməli, gələn məlumatı zəmanətli xassənin pozulmasını qeyri-mümkün edən tipə çevirməlidir. Bendersky eyni prizmanı Rust-a tətbiq edir və öyrədici nümunələri dilin standart kitabxanasında və tanınmış açıq mənbə layihələrində axtarır.
Boş ola bilməyən vektor
Başlanğıc nöqtəsi adi Vec və onun first() metodudur: vektor heç bir element saxlaya bilmədiyi üçün metod məcburi olmayan istinad qaytarır. Bendersky-nin nümunəsində funksiya CONFIG_DIRS mühit dəyişənindən konfiqurasiya qovluqlarını oxuyur və boş nəticəni rədd edir, lakin çağıran kod yenə də heç vaxt baş verməyəcək hal üçün ayrı budaq yazmalı olur. Müəllif belə invariantları saat mexanizmi olan bombaya bənzədir: kompilyator onları yoxlamır, ona görə də sonradan səssizcə poza bilərlər. Həll ayrı tipdir, məsələn nonempty crate-indəki NonEmpty: boş dəyər üçün konstruktoru yoxdur və first() adi istinad qaytarır. Yoxlanılmış Vec qaytarmaq validasiyadır, NonEmpty qaytarmaq isə parsinqdir, əgər parsini geniş mənada, məlumatın bir formatdan digərinə çevrilməsi kimi başa düşsək.
Borular, yollar və tədricən dəqiqləşdirmə
Sonra esse oyuncaq koddan kənara çıxır. POSIX-in əsas utilitlərini Rust ilə yenidən yazan posixutils-rs layihəsində shell borusunun əmrləri NonEmpty kimi saxlanılır, ona görə təhlil edilmiş boru həmişə ən azı bir əmr ehtiva edir və parser yalnız işə salınacaq heç nə olmadıqda None qaytarır. rust-analyzer-in mütləq fayl yolu üçün ayrı tipi var: yol mütləq deyilsə çevrilmə uğursuz olur və sonrakı kod şərti yenidən yoxlamaq əvəzinə tipə güvənir. Bendersky bunu tədricən parsinq adlandırır: yol əvvəlcə camino crate-i vasitəsilə etibarlı UTF-8, sonra isə mütləq olduğunu sübut edir.
Sıfırdan fərqli ədədlər və JSON
Rust-ın standart kitabxanasında sıfıra bərabər olmadığı bilinən işarəsiz ədədlər üçün ümumi NonZero tipi var. available_parallelism funksiyası uğurlu olduqda məhz belə dəyər qaytarır, NonZero məxrəclə bölmə isə panika sala bilməyən əməliyyat kimi sənədləşdirilib. Əlavə üstünlük də var: sıfır bu tip üçün yanlış bit nümunəsidir, ona görə məcburi olmayan NonZero adi tam ədədlə tam eyni yeri tutur. Eyni fikir JSON təhlilində də görünür: serde ilə konfiqurasiya strukturu elə təsvir edilə bilər ki, işçi sayı sıfırdan fərqli olsun, rejim isə iki dəyərli enum kimi elan edilsin; deserializasiya sahə tiplərini, icazə verilən dəyərləri və sıfır qadağasını bir addımda yoxlayır. Dinamik dillərdə bu proses daha çox əl işidir: Python-da json.loads lüğət qaytarır və yoxlamanı çağırana buraxır, Pydantic kimi kitabxanalar isə Rust yanaşmasına yaxınlaşır, amma hər yerdə istifadə olunmur.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.