@@ -288,4 +288,66 @@ fn main()
288288 " Response Time Decreasing" . to_string (),
289289 ));
290290}
291- ```
291+ ```
292+
293+ Fonksiyonlardan closure döndürme ile ilgili olarak farklı bir örnekle devam edelim. Bu örnekte metinsel ifadeler
294+ üzerinde doğrulama işlemlerini ele alan fonksiyonel bir tasarım söz konudur. Tüm metotlar dikkat edileceği üzere Fn
295+ türünden bir trait döndürmektedir.
296+
297+ ``` rust
298+ #[allow(dead_code)]
299+ fn min_length (length : usize ) -> impl Fn (& str ) -> bool {
300+ move | input | input . len () > length
301+ }
302+
303+ #[allow(dead_code)]
304+ fn is_digits_only () -> impl Fn (& str ) -> bool {
305+ | input | input . chars (). all (| c | c . is_ascii_digit ())
306+ }
307+
308+ #[allow(dead_code)]
309+ fn illegal_chars (illegals : Vec <char >) -> impl Fn (& str ) -> bool {
310+ move | input | input . chars (). any (| c | illegals . contains (& c ))
311+ }
312+
313+ #[cfg(test)]
314+ mod tests {
315+ use super :: * ;
316+
317+ #[test]
318+ fn min_length_test () {
319+ let validator = Box :: new (min_length (10 ));
320+ let input = " Jan Claud Van D@me!" ;
321+ assert! (validator (input ));
322+ }
323+
324+ #[test]
325+ fn only_digits_test () {
326+ let validator = Box :: new (is_digits_only ());
327+ let input = " 12345" ;
328+ assert! (validator (input ));
329+ }
330+
331+ #[test]
332+ fn illegal_chars_test () {
333+ let validator = Box :: new (illegal_chars (vec! ['=' , ';' ]));
334+ let input = " Select * from Products; 1=1; Select * from sys" ;
335+ assert! (validator (input ));
336+ }
337+ }
338+ ```
339+
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.
347+
348+ | Kullanım Durumu | move Gerekir mi? |
349+ | -----------------------------------------------------------------------------------| ------------------|
350+ | Closure bir thread’e yollanacaksa (Örn, thread::spawn üzerinden) | Evet |
351+ | Closure dışarıdan gelen String, Vec, Box gibi sahipliği alan türleri kullanıyorsa | Evet |
352+ | Döndürülen closure kendi bloğunda harici bir veriye ihtiyaç duyuyorsa | Evet |
353+ | Closure sadece referansla çalışıyor veya Copy Trait türevlerini kullanıyorsa | Hayır |
0 commit comments