Vergi Uzmanim Android Uygulamamiz Yayinda

Vergi sistemiyle ilgili olan tum hesaplamalari bir android uygulamasinda toplamaya calisiyoruz. Ilk versiyonumuz yayinda.
https://play.google.com/store/apps/details?id=com.mesorh.taxexpert

Rust Program Düzeni : Modüller

Gelistiridigimiz projeler buyudukce bu karmasikligi yonetmek icin dillerin bize sagladigi soyutlama ve paketleme mekanizmalarini kullaniyoruz. Javada package, C++ da namespace kavramlari birbiriyle ilintili olan kod kumelerini gruplamaya yarayan yapilar. Rust dilinde ayni gorev icin moduller kullaniliyor. Modül tanimlamak icin mod anahtar kelimesi kullaniliyor. Yeri gelmisken deginmeden edemeyecegim Rust anahtar kelime konusunda diger dillere gore basitlik acisindan onde. Sık kullanılan anahtar kelımeler oldukca kısa tutulmus. Ornegin fonksiyon icin fn, modul icin mod, public icin pub. Ilk olarak modul tanimlamayi ogrenelim. Ornegin bir oyun yazdigimizi dusunelim. Matematik hesaplamalarda kullanacagimiz yapilari math modulune, ai algoritmalarimizi da ai modulune koyalim. Tabi bu modullere ait alt moduller de tanimlayalim :

(daha fazla…)

Rust Cheatsheet

Rust ile ilgili hatirlamak amacli notlardir :

Cargo Komutlari

  • Yeni proje olusturmak icin cargo new proje_adi --bin komutunu kullaniyoruz
  • carate aramak icin cargo search crate_adi
  • test build run icin cargo test cargo build cargo run
  • cargo alt komutlarini listelemek icin cargo --list

String

  • &str -> String donusumu String::from(&str) seklinde yapiliyor
  • substring almak icin String yapisinin [begin_index..end_index] operatoru kullanilabilir
  • Herhangi bir tipi String e cevirmek icin o tipin to_string() fonksiyonunu kullanabilirsiniz num.to_string()
  • Herhangi bir Stringi diger tiplere cevirmek icin parse::().unwrap() fonksiyonunu kullaniyoruz
  • Stringi u8 vectore cevirmek icin into_bytes fonksiyonunu kullaniyoruz
  • byte arraydan Stringe donusum String::from_utf8_lossy fonksiyonu ile gerceklesiyor. Stringinizde unicode karakterler varsa istenmeyen sonuclar alabilirsiniz

Collections

  • HashMap kullanimi icin use std::collections::HashMap
  • HashMap eklemek icin insert(key,value) apisi kullaniliyor
  • HashMap de varmi kontrolu contains_key(key) apisi ile oluyor
  • HashMap de value get(key) ile alinabiliyor Option donuyor unwrap yapmak gerekiyor
  • Vec son elemani last() ile aliyoruz. eger son eleman uzerinde degisiklik yapmak istersek last_mut() kullanmaliyiz
  • Vec iterasyonlarinda i in vec.iter() yerine okunaklilik acisindan i in &vec kullaniyoruz
  • Elimizde Vec varsa bunu tek bir stringde birlestirmek icin concat() ve join() fonksiyonlarini kullaniyoruz
  • Vec nesnesinden 2 serli 3 erli gruplar elde etmek icin chunks fonksiyonunu kullaniyoruz. String icin bu yok maalesef.
  • slice parametreleri ffi interfaceden gecmek icin as_ptr kullaniyoruz

Iterator

  • Azalan bir iterator elde etmek icin (a..b).rev() kullaniyoruz
  • Iterasyonda ilk n elemani atlamak icin iter().skip(n) kullaniyoruz

Test

  • Floating point sayilar icin esitlik makrosu bulunmuyor. approx cratesi kulanilabilir
  • #[macro use] extern crate approx; partial_eq!()

Rust Dökümantasyon

Rust kod dokumantasyonuna onem veren bir dil ve bunu default olarak desteklemekte. Yani Rust alet cantasini bilgisayarimiza yukledigimizde rustdoc denilen kod yorumlarindan dokumantasyon olusturan yardimci yazilim da bilgisayarimiza yukleniyor. Bu araci rustdoc kaynak_kod_dosyasi.rs seklinde kullanabiliriz yada Rust un proje yonetim araci Cargo ile cargo doc seklinde de kullanabiliriz. Yazilim gelistirirken mutlaka guncel tutulan tek sey yazilim kaynak kodu oldugu icin dokumantasyonu kod yorumlarindan olusturmak tercih edilen bir uygulama. Bunu Java’da Javadoc, c++ da doxygen ile uyguluyoruz. Rust bu konuda markdown denen standardi destekliyor. Yorum bloklari /// uclu slash ile normal yorum bloklarindan ayriliyor. Klasik bir dokumantasyon blogu sunun gibi oluyor :

Dokumantasyon icinde kod blogu gostermek istiyorsak (ozellikle fonksiyonumuzun ormek kullanimi gibi ornek kodlar ise yariyor) ``` kullaniyoruz. Ornegin :


Burada dikkat etmemiz gereken hususlardan bir tanesi /// isaretlerinden sonra bosluk birakmamiz gerektigi sanirim Markup ile ilgili bir durum. ``` isaretleri ile varsayilan olarak rust kodu sentaksi renklendiriliyor. Bunun disinda bir dilden kod blogu gosterecekseniz bunu belirtmeniz gerekiyor. Ornegin java kodu eklemek istiyorsaniz ``` java seklinde kullanmaniz gerekiyor. Yukaridaki ornekte aslinda bir diger ozelligi de kullanmis olduk. # karakteri ile dokumantasyonda ana baslik, bolum olusturabiliyoruz.
(daha fazla…)

Mario Gomez Button Uygulamamiz Yayinda

Uygulamayi indir sende coskuya ortak ol. Panzer Mario Gomez golleri siralarken sen de toteme eslik et.
https://play.google.com/store/apps/details?id=mesorh.com.marirgomezbutton
Mario Gomez Button
Yazıyı Faydalı Bulduysanız Reklamlara Tıklayarak Siteye Destek Olabilirsiniz

Rust Closure

Fonksiyonel programlamanin bas aktorleri birinci sinif fonksiyonlar Rust dilinde de es gecilmemis. Isimli fonksiyonlarin nasil tanimlandigini daha onceki yazilarda gormustuk. Bu makalede isimsiz fonksiyonlardan yani closure lardan bahsedecegim. Closure yapilari fonksiyonel programlamanin bel kemigidir. Fonksiyonlarin diger fonksiyonlara parametre olarak gecilip, donus degeri olarak fonksiyonlari kullanabilmemizi saglarlar. Closurlerin en goze batan ozelligi tanimlandigi ortamdaki degiskenlere erisebilmeleridir ki isimleri de buradan gelir. Rust da closure sentaksi fonksiyonla birebir ayni olup () yerine || kullanilir. Ornek bir closure tanimini gorelim :

Yukarida verdigimiz closure ornegi parametresinden baska herhangi bir degiskene erismiyor, bir nevi statik fonksiyon. Yeni bir ornekte closurelarin tanimlandiklari ortamdaki degiskenleri nasil kapsama alanina aldigini (capture) gorelim.

3. satirda tanimladigimiz bigger_than_threshold closure 2. satirda tanimladigimiz threshold degiskenine erisebiliyor. 5. satirda ise tanimladigimiz closureu filter methoduna parametre olarak geciyoruz. Yani bir fonksiyonu digerine parametre olarak gonderiyoruz. Peki her fonksiyonu her fonksiyona parametre olarak gecebilir miyiz? Tabi ki de hayir. Buradaki filter fonksiyonunun imzasina baktigimizda parametre olarak aldigi fonksiyonun imzasinin da belitildigini goruyoruz. Bu imzada anlamadiginiz yerler olabilir. Generic ler ve genericlerin traitler ile sinirlandirilmasi sozkonusu.

2. satirda predicate parametresinin tipinin hangi tariti implement etmesi gerektigi gosteriliyor. Bu ornekten yola cikarak kendi metodlarimiza closure parametre almayi ve closurelari metodlarimizdan geri donmeyi ogrenelim. Bu sayede fonksiyon ureten fonksiyonlar yazabilir.Genel olarak gelistirdigimiz algoritmalarin ozel kisimlarini disaridan fonksiyon parametresi olarak alabiliriz. Bir ornekle fonksiyonlara parametre olarak fonksiyon gecmeyi ogrenelim. Yazacagimiz fonksiyon iki fonk. parametre alip bunlari 3. parametreye zincirleme olarak uygulayalim.

8. satirda tanimladigimiz closure_pipe fonksiyonumuz parametre olarak iki tane fonk. aliyor. 9. ve 10. satirlarda bu fonk. parametrelerinin tipini belirtiyoruz.

Yazıyı Faydalı Bulduysanız Reklamlara Tıklayarak Siteye Destek Olabilirsiniz

Rust Trait

Rust dili bildiğimiz manada kalitimi desteklemiyor. Yani herhangi bir sinifi diğerinden türetip var olan methodlardan faydalanamiyorsunuz. Bu duruma degisik cozumler uretebiliyoruz. Ornegin kalitim yerine composition deseni kullanilabilir. Kalitim desteklenmese de Trait denen yapilar sayesinde interfaceler destekleniyor. Trait lerin diger ismi de type classes. C++ stl kutuphanesinde, Scala gibi dillerde de trait kullanimini gorebiliriz. Trait lerin interfacelerden farki default bir gerceklemelerinin olabilmesi ki bu ozellik son versiyonunda Java’ya da eklendi, ve varolan siniflar icin de gerceklenebilir olmasi, Ornegin siz yeni bir trait tanimladiginizda bunu sizin tanimlamadiginiz veri tipleri icin de gercekleyebilirsiniz. Trait anahtar kelimesi kullanilarak tanimlaniyorlar. Implementasyonlari ise impl ve for anahtar kelimeleri ile oluyor. Ornegimizi karsilastirilabilir yapilari temsil etmek uzere bir Comparable trait tanimi ve bunun farkli iki struct icin gerceklemesini gosterek gelistirelim :

1. satirda comparable trait taniminin gorebilirsiniz. Bu trait tek bir method imzasi tanimindan ibaret. Self tipinin kullanimi onemli. 11. ve 27. satirlarda ise comparable taritinin StockField ve ScoreSheet isimli iki struct icin gerceklemesini goruyoruz.

Tanimladigimiz structlardan ikiser tane olusturup bunlari karsilastirarak kullnimi da gormus olalim :