@@ -25,12 +25,12 @@ Bu trait'ler bir anlamda C# tarafından gelenler için delegate türüne de benz
2525
2626## Filtreleme ve Sıralama İşlemleri
2727
28- Takip eden örnekler Game türünden veriler içeren bir vector ile ilişkilidir. Örnek oyun bilgileri
29- için [ repository.rs] ( ./src/repository.rs ) dosyasına bakılabilir. Çok basit bir örnekle başlayalım. Oyunları yıllara göre
30- sıralamak istediğimizi düşünelim. Normalde vector türleri belli bir key değerine göre sıralama işlemi için ** sort_by_key
31- ** isimli metodu sağlar. Bu metod ** FnMut(&T) -> K** davranışını uygulayan bir ifade bekler. Bir başka deyişle sıralama
32- için kullanılacak anahtar alanı ele alacağı bir davranışa ihtiyaç duyar. Buna göre aşağıdaki gibi bir örnek
33- yazılabilir.
28+ Takip eden örnekler farklı veri türlerini kullanır ve bunlar [ models.rs ] ( ./src/models.rs ) dosyasında yer almaktadır.
29+ Örnek oyun bilgileri içinse [ repository.rs] ( ./src/repository.rs ) dosyasına bakılabilir. Çok basit bir örnekle
30+ başlayalım. Oyunları yıllara göre sıralamak istediğimizi düşünelim. Normalde vector türleri belli bir key değerine göre
31+ sıralama işlemi için ** sort_by_key ** isimli metodu sağlar. Bu metod ** FnMut(&T) -> K** davranışını uygulayan bir ifade
32+ bekler. Bir başka deyişle sıralama için kullanılacak anahtar alanı ele alacağı bir davranışa ihtiyaç duyar. Buna göre
33+ aşağıdaki gibi bir örnek yazılabilir.
3434
3535``` rust
3636mod repository ;
@@ -237,4 +237,55 @@ fn main()
237237
238238## Fonksiyonlardan Closure Döndürülmesi
239239
240- NotYetImplemented();
240+ Pek tabii fonksiyonlardan Fn, FnMut veya FnOnce davranışlarını uyarlayan fonksiyonlar da döndürülebilir. Örneğin
241+ sistemde üretilen log bilgilerini türlerine göre anında sayan bir senaryomuz olduğunu düşünelim. Log içeriğine göre bunu
242+ kullanan bir fonksiyon aşağıdaki gibi tasarlanabilir.
243+
244+ ``` rust
245+ use crate :: models :: {Level , Log };
246+ use std :: io :: {Write , stdout};
247+
248+ pub fn log () -> impl FnMut (& Log ) {
249+ let mut error_count = 0 ;
250+ let mut warn_count = 0 ;
251+ let mut info_count = 0 ;
252+ move | l | {
253+ stdout ()
254+ . write (format! (" {}\ n" , l . to_string ()). as_bytes ())
255+ . unwrap ();
256+ match l . level {
257+ Level :: Error => error_count += 1 ,
258+ Level :: Warn => warn_count += 1 ,
259+ Level :: Info => info_count += 1 ,
260+ _ => {}
261+ }
262+ stdout ()
263+ . write (
264+ format! (
265+ " Log Tracker: {} errors, {} warnings, {} infos\ n" ,
266+ error_count , warn_count , info_count
267+ )
268+ . as_bytes (),
269+ )
270+ . unwrap ();
271+ }
272+ }
273+ ```
274+
275+ log metodu geriye Log türünden referanslar alabilen ** FnMut** türünden bir trait döndürmektedir. Fonksiyon ekrana log
276+ mesajını basarken bir yandan da seviyelere göre toplamları hesaplar. Bu fonksiyon aşağıdaki gibi kullanılabilir.
277+
278+ ``` rust
279+ fn main ()
280+ {
281+ let mut logger = log ();
282+
283+ logger (& Log :: new (Level :: Info , " Authentication Success" . to_string ()));
284+ logger (& Log :: new (Level :: Error , " File Not Found" . to_string ()));
285+ logger (& Log :: new (Level :: Error , " Login failed" . to_string ()));
286+ logger (& Log :: new (
287+ Level :: Warn ,
288+ " Response Time Decreasing" . to_string (),
289+ ));
290+ }
291+ ```
0 commit comments