Skip to content

Commit d278653

Browse files
committed
Updated readme document.
1 parent 183af79 commit d278653

1 file changed

Lines changed: 58 additions & 7 deletions

File tree

Lesson_09/README.md

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
3636
mod 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

Comments
 (0)