Skip to content

Commit b81d95f

Browse files
authored
Update FinalExam.md
1 parent 4967aa1 commit b81d95f

File tree

1 file changed

+142
-4
lines changed

1 file changed

+142
-4
lines changed

FinalExam.md

Lines changed: 142 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,150 @@ Buna göre aşağıdakiler hangisi veya hangileri doğrudur?
2525
- **II.** T: Copy: T türü kopyalanabilir (Copy trait’ini implemente etmiş) olmalıdır.
2626
- **III.** T: Add<Output = T>: T türü toplama (+) işlemini desteklemelidir.
2727

28-
a) Sadece I
28+
**a)** Sadece I
2929

30-
b) I ve II
30+
**b)** I ve II
3131

32-
c) II ve III
32+
**c)** II ve III
3333

34-
d) Hepsi doğrudur
34+
**d)** Hepsi doğrudur
3535

3636
## Soru 2
37+
38+
**Enum** veri yapılarında da **generic** türler kullanılabilir. Aşağıdaki örnek kod parçasında **Success** değeri generic **T** türü ile tanımlanmıştır.
39+
40+
```rust
41+
#[derive(Debug)]
42+
enum ApiResponse<T> {
43+
Success(T),
44+
Error(String),
45+
}
46+
```
47+
48+
Buna göre aşağıdaki ifadelerden hangisi söz konusu enum veri yapısının doğru kullanımlarından **değildir**?
49+
50+
**a)** let res: ApiResponse<i32> = ApiResponse::Success(200);
51+
52+
**b)** let res: ApiResponse<&str> = ApiResponse::Error("404 Bad Request".to_string());
53+
54+
**c)** let res: ApiResponse = ApiResponse::Success(201);
55+
56+
**d)** let res: ApiResponse<i16> = ApiResponse::Success(201);
57+
58+
## Soru 3
59+
60+
**Trait** türü belirli bir davranış kümesini tanımlayan ve bunu bir veya birden fazla veri yapısına uygulayabilen bir enstrümandır. Bazı durumlarda **trait**'i implemente eden nesnelerin dinamik olarak saklanması gerekir. Bu gibi durumlarda **Trait Object** kullanılır. Aşağıdaki kod parçasında **Draw** isimli bir trait ve örnek uygulamalarına yer verilmiştir.
61+
62+
```rust
63+
trait Draw {
64+
fn draw(&self);
65+
}
66+
67+
struct Circle;
68+
struct Square;
69+
struct Player;
70+
71+
impl Draw for Circle {
72+
fn draw(&self) {
73+
println!("Drawing a circle");
74+
}
75+
}
76+
77+
impl Draw for Square {
78+
fn draw(&self) {
79+
println!("Drawing a square");
80+
}
81+
}
82+
83+
impl Draw for Player {
84+
fn draw(&self) {
85+
println!("Drawing a player");
86+
}
87+
}
88+
```
89+
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?
91+
92+
**a)**
93+
94+
```rust
95+
fn draw_shapes(shapes: &Vec<&dyn Draw>) {
96+
for shape in shapes.iter() {
97+
shape.draw();
98+
}
99+
}
100+
```
101+
102+
**b)**
103+
104+
```rust
105+
fn draw_shapes(shapes: &Vec<Draw>) {
106+
for shape in shapes.iter() {
107+
shape.draw();
108+
}
109+
}
110+
```
111+
112+
**c)**
113+
114+
```rust
115+
fn draw_shapes(shapes: [&dyn Draw]) {
116+
for shape in shapes.iter() {
117+
shape.draw();
118+
}
119+
}
120+
```
121+
122+
**d)**
123+
124+
```rust
125+
fn draw_shapes(shapes: &Vec<&Draw>) {
126+
for shape in shapes.iter() {
127+
shape.draw();
128+
}
129+
}
130+
```
131+
132+
## Soru 4
133+
134+
Rust standart kütüphanesi ile birlikte gelen önceden tanımlı birçok **trait** vardır. Örneğin **println** makrosunda **:?** formatının kullanılabilmesi için **Debug** trait’inin uyarlanmış olması beklenir. Sık kullanılan tarit’ lerden ikisi de veri sahipliği _(Ownership)_ ile ilgili olan **Clone** ve **Copy trait**’leridir. Bu bilgi ışığında aşağıda verilen kod parçasını dikkatlice inceleyiniz.
135+
136+
```rust
137+
#[derive(Debug, PartialEq)]
138+
struct Velocity {
139+
x: f32,
140+
y: f32,
141+
}
142+
143+
fn accelerate(mut speed: Velocity) {
144+
speed.x += 1.0;
145+
speed.y += 1.0;
146+
println!("Accelerating: {:#?}", speed);
147+
}
148+
149+
fn main() {
150+
let my_speed = Velocity { x: 10.0, y: 0.0 };
151+
let your_speed = Velocity { x: 10.0, y: 0.0 };
152+
153+
accelerate(your_speed);
154+
155+
if my_speed == your_speed {
156+
println!("{my_speed:?} is equal to {your_speed:?}")
157+
} else {
158+
println!("{my_speed:?} is not equal to {your_speed:?}")
159+
}
160+
}
161+
```
162+
163+
Yukarıdaki kod parçası derleme zamanında **Value used after being moved [E0382]** hatası vermektedir. Şıklardan hangisi hatanın sebebi ve çözüm yolunu belirtir.
164+
165+
**a)** Hatanın sebebi PartialEq trait'inin eksik olmasıdır. Velocity yapısına Eq trait'i de eklenirse == karşılaştırması çalışır ve hata giderilir.
166+
167+
**b)** Rust dilinde struct türleri varsayılan olarak zaten Copy trait'ini uygular. Bu nedenle kod hatasız derlenir.
168+
169+
**c)** Hata, accelerate fonksiyonunun parametresinin mutable olarak tanımlanmış olmasından kaynaklanır. mut kaldırılırsa ownership problemi ortadan kalkar.
170+
171+
**d)** your_speed değişkeni accelerate fonksiyonuna geçirilirken kopyalanmadan taşınır ve accelerate işleyişini tamamlandığında sahipliği alınan your_speed bellekten düşer. Bu, devam eden satırda olmayan bir referans erişimine sebebiyet verir ve value moved hatası oluşur. Hatanın çözümü için Velocity yapısına Clone trait'ini uygulamak gerekir ve accelerate(your_speed.clone()) şeklinde çağrılmalıdır.
172+
173+
## Soru 5
174+

0 commit comments

Comments
 (0)