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
+142-4Lines changed: 142 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,12 +25,150 @@ Buna göre aşağıdakiler hangisi veya hangileri doğrudur?
25
25
-**II.** T: Copy: T türü kopyalanabilir (Copy trait’ini implemente etmiş) olmalıdır.
26
26
-**III.** T: Add<Output = T>: T türü toplama (+) işlemini desteklemelidir.
27
27
28
-
a) Sadece I
28
+
**a)** Sadece I
29
29
30
-
b) I ve II
30
+
**b)** I ve II
31
31
32
-
c) II ve III
32
+
**c)** II ve III
33
33
34
-
d) Hepsi doğrudur
34
+
**d)** Hepsi doğrudur
35
35
36
36
## 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
+
enumApiResponse<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
+
traitDraw {
64
+
fndraw(&self);
65
+
}
66
+
67
+
structCircle;
68
+
structSquare;
69
+
structPlayer;
70
+
71
+
implDrawforCircle {
72
+
fndraw(&self) {
73
+
println!("Drawing a circle");
74
+
}
75
+
}
76
+
77
+
implDrawforSquare {
78
+
fndraw(&self) {
79
+
println!("Drawing a square");
80
+
}
81
+
}
82
+
83
+
implDrawforPlayer {
84
+
fndraw(&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
+
fndraw_shapes(shapes:&Vec<&dynDraw>) {
96
+
forshapeinshapes.iter() {
97
+
shape.draw();
98
+
}
99
+
}
100
+
```
101
+
102
+
**b)**
103
+
104
+
```rust
105
+
fndraw_shapes(shapes:&Vec<Draw>) {
106
+
forshapeinshapes.iter() {
107
+
shape.draw();
108
+
}
109
+
}
110
+
```
111
+
112
+
**c)**
113
+
114
+
```rust
115
+
fndraw_shapes(shapes: [&dynDraw]) {
116
+
forshapeinshapes.iter() {
117
+
shape.draw();
118
+
}
119
+
}
120
+
```
121
+
122
+
**d)**
123
+
124
+
```rust
125
+
fndraw_shapes(shapes:&Vec<&Draw>) {
126
+
forshapeinshapes.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
+
structVelocity {
139
+
x:f32,
140
+
y:f32,
141
+
}
142
+
143
+
fnaccelerate(mutspeed:Velocity) {
144
+
speed.x +=1.0;
145
+
speed.y +=1.0;
146
+
println!("Accelerating: {:#?}", speed);
147
+
}
148
+
149
+
fnmain() {
150
+
letmy_speed=Velocity { x:10.0, y:0.0 };
151
+
letyour_speed=Velocity { x:10.0, y:0.0 };
152
+
153
+
accelerate(your_speed);
154
+
155
+
ifmy_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.
0 commit comments