@@ -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