Geri Dön
Rust'ta Parse, don't validate: denetimi tipe dönüştürmek
SiTech AI Team2 წთ. საკითხავი

Rust'ta Parse, don't validate: denetimi tipe dönüştürmek

Eli Bendersky, 'Parse, don't validate' fikrini Rust için yeniden inceliyor: bir koşulu denetleyip ona güvenmek yerine, veriyi değişmezi bozulamayan bir tipe dönüştürmek.

Eli Bendersky, blogunda Alexis King'in 2019 tarihli makalesindeki bir fikri yeniden ele alan yeni bir yazı yayımladı. Haskell için yazılmış özgün metin, kodun bir koşulu yalnızca bir kez denetleyip ona güvenmemesi gerektiğini, gelen verinin garanti edilen özelliği ihlal etmeyi imkânsız kılan bir tipe dönüştürülmesi gerektiğini savunuyor. Bendersky aynı merceği Rust'a tutuyor ve öğretici örnekleri dilin standart kütüphanesinde ve tanınmış açık kaynak projelerinde arıyor.

Boş olamayan bir vektör

Çıkış noktası sıradan Vec ve onun first() metodu: bir vektör hiç eleman içermeyebileceği için metot isteğe bağlı bir referans döndürüyor. Bendersky'nin örneğinde bir fonksiyon CONFIG_DIRS ortam değişkeninden yapılandırma dizinlerini okuyor ve boş sonucu reddediyor; buna rağmen çağıran kod, hiç gerçekleşmeyecek durum için bir dal yazmak zorunda kalıyor. Yazar bu tür değişmezleri saatli bombaya benzetiyor: derleyici onları denetlemiyor, dolayısıyla sonradan sessizce bozulabilirler. Çözüm ayrı bir tip: örneğin nonempty crate'indeki NonEmpty, boş değer için kurucu sunmuyor ve first() düz bir referans döndürüyor. Denetlenmiş bir Vec döndürmek doğrulama, NonEmpty döndürmek ise ayrıştırma; yani veriyi bir biçimden diğerine dönüştürmek.

Boru hatları, yollar ve kademeli arıtma

Yazı daha sonra oyuncak kodun ötesine geçiyor. POSIX çekirdek araçlarının Rust ile yeniden yazımı olan posixutils-rs, kabuk boru hattının komutlarını NonEmpty olarak saklıyor; böylece ayrıştırılmış bir boru hattı her zaman en az bir komut içeriyor ve ayrıştırıcı, çalıştıracak bir şey bulamadığında None döndürüyor. rust-analyzer'ın mutlak dosya yolu için ayrı bir tipi var: dönüşüm, yol mutlak değilse başarısız oluyor ve sonraki kod koşulu yeniden denetlemek yerine tipe güveniyor. Bendersky buna kademeli ayrıştırma diyor: bir yol önce camino crate'iyle geçerli UTF-8 olduğunu kanıtlıyor, ancak ondan sonra mutlak olduğunu.

Sıfır olmayan sayılar ve JSON

Rust'ın standart kütüphanesinde, sıfır olmadığı bilinen işaretsiz sayılar için genel bir NonZero tipi var. available_parallelism fonksiyonu başarılı olduğunda böyle bir değer döndürüyor ve NonZero bölenle bölme, panik yapamayacak bir işlem olarak belgeleniyor. Ek bir avantaj da var: sıfır bu tip için geçersiz bir bit deseni olduğundan, isteğe bağlı bir NonZero sıradan bir tam sayıyla tam olarak aynı yeri kaplıyor. Aynı fikir JSON ayrıştırmasında da görülüyor: serde ile bir yapılandırma yapısı, çalışan sayısını sıfırdan farklı ve modu iki değerli bir enum olarak tanımlayabiliyor; serileştirme çözme işlemi alan tiplerini, izin verilen değerleri ve sıfır yasağını tek adımda uyguluyor. Dinamik dillerde süreç çok daha elle yapılıyor: Python'da json.loads bir sözlük döndürüyor ve denetimi çağırana bırakıyor; Pydantic gibi kitaplıklar Rust yaklaşımına yaklaşıyor ama her yerde kullanılmıyor.

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.