Skip to content

Commit 96b3fa3

Browse files
committed
Updated readme document
1 parent 077607d commit 96b3fa3

File tree

1 file changed

+63
-1
lines changed

1 file changed

+63
-1
lines changed

Lesson_09/README.md

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)