Skip to content

Commit 3e3a751

Browse files
committed
Updated readme document
1 parent 96b3fa3 commit 3e3a751

File tree

1 file changed

+57
-7
lines changed

1 file changed

+57
-7
lines changed

Lesson_09/README.md

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -337,17 +337,67 @@ mod tests {
337337
}
338338
```
339339

340-
Bazı fonksiyonlarda **move** keyword kullanıldığı gözden kaçırılmamalıdır. move keyword dışarıdan gelen bir değişken
341-
varsa onun sahipliğinin closure bloğuna taşınması için kullanılır. Özellikle closure ifadelerinin bir thread içerisinde
342-
kendi başlarına yaşamaya devam etmeleri gerekiyorsa bu bildirim zorunludur. Elbette sahiplik alınması için gerekli
343-
koşullar söz konusu ise move kullanılır. String ve Vec gibi türlerdede Copy trait implementasyonu olmadığında sahipliğin
344-
bilinçli olarak taşınacağı belirtilmelidir. **move** keyword kullanımı zaman zaman kafa karıştırıcı olabilir. Derleme
345-
zamanı her ne kadar uyarsa da hangi durumlarda gerekli olduğunu bilmek önemlidir. Bunun için aşağıdaki özet tablodan
346-
yararlanılabilir.
340+
## move Keyword Kullanımı
341+
342+
Bazı fonksiyonlarda **move** operatörü kullanıldığı gözden kaçırılmamalıdır. Bu operatör dışarıdan gelen bir değişken
343+
varsa onun sahipliğinin **closure** bloğuna taşınmak için kullanılır. Özellikle closure ifadelerinin bir thread
344+
içerisinde kendi başlarına yaşamaya devam etmeleri gerekiyorsa bu bildirim zorunludur. Elbette sahiplik alınması için
345+
gerekli koşullar söz konusu ise move kullanılır. **String** ve **Vec** gibi türlerdede Copy trait implementasyonu
346+
olmadığında sahipliğin bilinçli olarak taşınacağı belirtilmelidir. **move** keyword kullanımı zaman zaman kafa
347+
karıştırıcı olabilir. Derleme zamanı her ne kadar uyarsa da hangi durumlarda gerekli olduğunu bilmek önemlidir. Bunun
348+
için aşağıdaki özet tablodan yararlanılabilir.
347349

348350
| Kullanım Durumu | move Gerekir mi? |
349351
|-----------------------------------------------------------------------------------|------------------|
350352
| Closure bir thread’e yollanacaksa (Örn, thread::spawn üzerinden) | Evet |
351353
| Closure dışarıdan gelen String, Vec, Box gibi sahipliği alan türleri kullanıyorsa | Evet |
352354
| Döndürülen closure kendi bloğunda harici bir veriye ihtiyaç duyuyorsa | Evet |
353355
| Closure sadece referansla çalışıyor veya Copy Trait türevlerini kullanıyorsa | Hayır |
356+
357+
Kullanımla ilgili bazı örnekler;
358+
359+
```rust
360+
fn main() {
361+
let message = String::from("Hello Rust");
362+
let _ = || println!("{}", message);
363+
println!("{}", message);
364+
}
365+
```
366+
367+
Yukarıdaki kullanımda message isimli değişkenin closure tanımı sonrası da kullanılabildiği görülür. Ancak burada move
368+
operatörü ile bilinçli şekilde sahipliği closure içerisine aktarırsak bir hata alırız.
369+
370+
```rust
371+
fn main() {
372+
let message = String::from("Hello Rust");
373+
let _ = move || println!("{}", message);
374+
println!("{}", message);
375+
}
376+
```
377+
378+
Bu durumda aşağıdaki hata üretilir.
379+
380+
```text
381+
let message = String::from("Hello Rust");
382+
| ------- move occurs because `message` has type `String`, which does not implement the `Copy` trait
383+
88 | let _ = move || println!("{}", message);
384+
| ------- ------- variable moved due to use in closure
385+
| |
386+
| value moved into closure here
387+
89 | println!("{}", message);
388+
| ^^^^^^^ value borrowed here after move
389+
```
390+
391+
Burada String türünün kullanılması taşıma hatasına sebebiyet vermektedir. Zira **Copy trait** uygulayan bir türün
392+
kullanılırsa sorun oluşmayacaktır.
393+
394+
```rust
395+
fn main() {
396+
let value = 23;
397+
let closure_1 = || println!("{}", value);
398+
let closure_2 = move || println!("{}", value);
399+
closure_1();
400+
closure_2();
401+
}
402+
```
403+

0 commit comments

Comments
 (0)