You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: FinalExam.md
+165-4Lines changed: 165 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -90,7 +90,6 @@ impl Draw for Player {
90
90
Bu tasarıma göre **draw** davranışını uygulamış belli sayıda nesne için tek bir **for** döngüsü üzerinden işlem yapan ve gelen nesnelerin **draw** fonksiyonlarını işleten bir metot yazılması istenmektedir. Aşağıdaki metotlardan hangisi doğrudur?
@@ -172,3 +168,168 @@ Yukarıdaki kod parçası derleme zamanında **Value used after being moved [E03
172
168
173
169
## Soru 5
174
170
171
+
**Trait** ve **closure**’lar sıklıkla bir arada ele alınır. Bir **closure** anonim fonksiyon olarak da ifade edilir. Özellikle fonksiyonel dillerde yaygın olarak kullanılan closure'lar, bir değişkene atanabilir ve bu sayede fonksiyonlara parametre olarak kod bloklarının taşınması sağlanabilir. Benzer şekilde fonksiyonlardan dönüş türü olarak da kullanılabilir. Böylece nesne toplulukları üzerinde aynı kod bloğunu işleten fonksiyonları geliştirmek oldukça kolaylaşır. Tüm iteratif fonksiyonlar bu tekniğe göre geliştirilmiştir. Rust, closure kullanımlarında kısıtlar _(Constraints)_ da kullanır ve bunu üç farklı **trait** ile sağlar.
172
+
173
+
-**Fn:** Closure, dışarıdan yakaladığı değişkenleri salt okunur _(read only)_ şekilde kullanır.
174
+
-**FnMut:** Closure, dış değişkenleri değiştirerek _(mutable)_ kullanabilir.
175
+
-**FnOnce:** Closure, dış değişkenleri sahiplenir _(move eder)_ ve yalnızca bir kez çağrılabilir.
176
+
177
+
Geliştirdiğimiz örnekte bir oyun sahasındaki nesneler üzerinde parametre olarak gönderilen kod bloğunu işletecek genel bir fonksiyon yazmak istediğimizi düşünelim.
178
+
179
+
```rust
180
+
pubfnmain() {
181
+
letmutworld=GameWorld {
182
+
players:vec![
183
+
Player {
184
+
id:1,
185
+
position: (0.0, 0.0),
186
+
velocity: (2.0, 0.0),
187
+
score:0,
188
+
},
189
+
Player {
190
+
id:2,
191
+
position: (100.0, 0.0),
192
+
velocity: (8.0, 0.0),
193
+
score:0,
194
+
},
195
+
],
196
+
};
197
+
198
+
letapply_gravity=|entity:&mutPlayer| {
199
+
entity.position.0+=entity.velocity.0*0.9;
200
+
entity.position.1+=entity.velocity.1*0.9;
201
+
};
202
+
203
+
println!("Before Update: {:?}", world.players);
204
+
update_players_system(&mutworld, apply_gravity);
205
+
}
206
+
```
207
+
208
+
Bu kod parçasını göz önüne alırsak aşağıdakilerden hangisi update_players_system’in doğru bir tanımıdır?
Buna göre aşağıdaki şıklarda belirtilen ifadelerden hangisi doğrudur?
294
+
295
+
**a)** Closure Copy trait’ine sahiptir, dolayısıyla her çağrıldığında iç sayaçlar sıfırdan başlar.
296
+
297
+
**b)** Dönüş tipi impl Fn(&Log) olarak da yazılabilir çünkü closure yalnızca okuma yapmaktadır.
298
+
299
+
**c)** Closure, mut olarak çağrılmak zorundadır çünkü error_count, warn_count, info_count değerleri her çağrımda değişir. Bu nedenle dönüş tipi impl FnMut(&Log) olarak belirtilmiştir.
300
+
301
+
**d)** Kodda move ifadesinin kullanılmasına gerek yoktur. error_count, warn_count, info_count değerleri heap üzerinde tutulmadığı için closure zaten bu değerlere doğrudan erişebilir.
Yukarıdaki kod derleme zamanında **error[E0391]: cycle detected when computing when `Tree` needs drop** hatası verir. Bu hatanın sebebi şıklardan hangisidir?
324
+
325
+
**a)** Enum yapısında Empty varyantının bulunması Node varyantını geçersiz kılıp Rust’ın match yapısının kullanmasını gerektirdiği için hata alınır.
326
+
327
+
**b)** Enum Tree kendi içinde doğrudan kendisini barındırdığı için sonsuz büyüklükte bir veri yapısı oluşur ve bu kontrol edilebilir değildir. Çözüm için Box<Tree> gibi bir Smart Pointer kullanılarak recursive alanların heap’e taşınması sağlanmalıdır.
328
+
329
+
**c)** Tree yapısı içinde kullanılan i32 türünün Drop trait'ini implemente etmemesi sebebiyle hata oluşur.
330
+
331
+
**d)** Rust, enum türleri içinde başka enum’ları doğrudan kullanmayı desteklemez. Bu nedenle Tree enum’unun kendi türünde alanları olamaz.
0 commit comments