Skip to content

Commit c897a73

Browse files
committed
Updated readme document
1 parent 120cd53 commit c897a73

File tree

5 files changed

+182
-2
lines changed

5 files changed

+182
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[workspace]
2-
members = ["Lesson_00", "Lesson_01", "Lesson_02", "Lesson_03", "Lesson_04", "Lesson_05", "Lesson_06", "Lesson_07", "Lesson_08", "Lesson_09", "collector", "drone-lab", "fops", "mocking", "sysco", "sysco2"]
2+
members = ["Lesson_00", "Lesson_01", "Lesson_02", "Lesson_03", "Lesson_04", "Lesson_05", "Lesson_06", "Lesson_07", "Lesson_08", "Lesson_09", "Lesson_10", "collector", "drone-lab", "fops", "mocking", "sysco", "sysco2"]
33

44
resolver = "2"

Lesson_10/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "Lesson_10"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]

Lesson_10/Readme.md

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# Ders 10: Smart Pointers
2+
3+
Verinin bellekteki temsili sırasında şartlara göre farklı senaryolar için farklı enstrümanlar kullanılabilir. Bu nedenle
4+
**Smart Pointer** kullanımını bilmek önemlidir. Smart Pointer türlerine geçmeden önce bazı temek kavramlar üzerinde
5+
duralım. Rust dilinde birçok smart pointer vardır. Box, RefCell, Rc, Arc gibi
6+
7+
- Pointer
8+
- Bellek üzerindeki bir veri içeriğini işaret eden adres bilgisini taşıyan değişken olarak düşünülebilir.
9+
- Farkında olmadan şu ana kadar kullandığımız bir pointer vardır (&) ve datayı referans etmekte kullanılır.
10+
- Smart Pointer
11+
- Pointer adreslerine ek metadata bilgileri veya kabiliyetler ekler. Rust diline özel bir kavram değildir
12+
esasında C++ orijinlidir.
13+
- Referanslar veriyi işaret ederken Smart Pointer’ lar genellikle sahipliğini de alır. String ve Vec<T>
14+
türleri smart pointer olarak da geçerler, zira belli bir bellek adresindeki verinin sahipliğini alırlar ve onu
15+
manipüle etmemize izin verirler.
16+
- **Deref** ve **Drop** trait’lerini implemente eden struct türleri olarak tasarlanabilirler _(Yani kendi Smart
17+
Pointer modellerimizi tasarlayabiliriz)_
18+
19+
## Hangisi ne zaman?
20+
21+
**Box** ve **RefCell** birden fazla sahipliği tek bir veri üzerinde sağlarken, Rc aynı veri üzerinden birden fazla
22+
sahiplik sunar. Box immutable veya mutable ödünç alma _(borrowing)_ için derleme zamanında kontrol sağlar. Rc sadece
23+
immutable borrowing için derleme zamanında kontrol sağlar.RefCell immutable veya mutable ödünç alma için runtime'da
24+
kontrol sağlar.
25+
26+
## Boxing
27+
28+
Bir veriyi Stack yerine Heap üzerinde konuşlandırmanın en basit hali Box enstrümanını kullanmaktır. Aşağıda bu kullanıma
29+
ait basit bir fonksiyon yer almaktadır.
30+
31+
```rust
32+
pub fn simple_boxing() {
33+
let value = 23; // Normalde stack' de saklanır
34+
let boxed_value = Box::new(value); // Şimdi heap'e alındı ama boxed_value hala stack'te zira adres göstermekte
35+
println!("Boxed value is {}", boxed_value);
36+
37+
let identity = ("John Smith", 23, true); // tuple veriyi stack'ta saklar
38+
let boxed_identity = Box::new(identity); // Şimdi heap' te
39+
println!("Boxed identity is {:?}", boxed_identity);
40+
}
41+
```
42+
43+
value isimli değişken sayısal bir değerdir ve normal şartarda Stack'te tutulur. Box ile söz konusu değişken verisi
44+
heap'e alınır ve stack'de onu işaret eden bir işaretçi bırakılır. Benzer bir kullanım şeklide Tuple veri türü içinde ele
45+
alınmıştır. Box türünün kullanımı için sıkça vurgulanan senaryolardan birisi ağaç boğum modelleridir _(Tree Nodes)_
46+
Aşağıdaki örnek kod parçasını göz önüne alalım.
47+
48+
```rust
49+
fn main() {
50+
recursive_data_model_with_error()
51+
}
52+
enum Tree {
53+
Node(i32, Tree, Tree),
54+
Empty,
55+
}
56+
57+
pub fn recursive_data_model_with_error() {
58+
let left_child = Tree::Node(1, Tree::Empty, Tree::Empty);
59+
let right_child = Tree::Node(3, Tree::Empty, Tree::Empty);
60+
let root = Tree::Node(2, left_child, right_child);
61+
}
62+
```
63+
64+
Bu kod parçası derlenmeyecektir ve şöyle bir hata mesajı verecektir.
65+
66+
```text
67+
error[E0072]: recursive type `Tree` has infinite size
68+
```
69+
70+
Buradakine benzer recursive veri modellerinden datanın ne kadar yer kaplayacağı derleme zamanında bilinemez. Senaryoda
71+
enum türü kullanıldığı için de stack önceklikli bir yer ayırma durumu söz konusudur. Ne kadar boyut kaplanacağının
72+
bilinmemesi taşma hatalarına sebebiyet verebilir. Bir düğüm kendisine referans verdikçe bu sonsuz boyutlamaya doğru
73+
gidebilir. Dolayısıyla veriyi Heap üzerinde konuşlandırmak daha mantıklıdır. Benzer bir senaryoyu bu sefer aşağıdaki
74+
gibi tasarlayarak devam edelim.
75+
76+
```rust
77+
use std::fmt::{Display, Formatter};
78+
79+
enum Server {
80+
Node(String, Box<Server>, Box<Server>),
81+
Empty,
82+
}
83+
impl Display for Server {
84+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
85+
match self {
86+
Server::Node(name, primary, backup) => {
87+
write!(
88+
f,
89+
"Server: {}\n Primary: {}\n Backup: {}",
90+
name, primary, backup
91+
)
92+
}
93+
Server::Empty => write!(f, "None"),
94+
}
95+
}
96+
}
97+
98+
pub fn recursive_sample() {
99+
let backup_server_blue = Server::Node(
100+
String::from("Backup Server Blue"),
101+
Box::new(Server::Empty),
102+
Box::new(Server::Empty),
103+
);
104+
105+
let primary_server_green = Server::Node(
106+
String::from("Primary Server Green"),
107+
Box::new(Server::Empty),
108+
Box::new(backup_server_blue),
109+
);
110+
111+
let root_server = Server::Node(
112+
String::from("Root Server"),
113+
Box::new(primary_server_green),
114+
Box::new(Server::Node(
115+
String::from("Backup Root"),
116+
Box::new(Server::Empty),
117+
Box::new(Server::Empty),
118+
)),
119+
);
120+
121+
println!("{}", root_server);
122+
}
123+
```
124+
125+
// DEVAM EDECEK

Lesson_10/src/main.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
fn main() {
2+
recursive_sample()
3+
}
4+
use std::fmt::{Display, Formatter};
5+
6+
enum Server {
7+
Node(String, Box<Server>, Box<Server>),
8+
Empty,
9+
}
10+
impl Display for Server {
11+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
12+
match self {
13+
Server::Node(name, primary, backup) => {
14+
write!(
15+
f,
16+
"Server: {}\n Primary: {}\n Backup: {}",
17+
name, primary, backup
18+
)
19+
}
20+
Server::Empty => write!(f, "None"),
21+
}
22+
}
23+
}
24+
25+
pub fn recursive_sample() {
26+
let backup_server_blue = Server::Node(
27+
String::from("Backup Server Blue"),
28+
Box::new(Server::Empty),
29+
Box::new(Server::Empty),
30+
);
31+
32+
let primary_server_green = Server::Node(
33+
String::from("Primary Server Green"),
34+
Box::new(Server::Empty),
35+
Box::new(backup_server_blue),
36+
);
37+
38+
let root_server = Server::Node(
39+
String::from("Root Server"),
40+
Box::new(primary_server_green),
41+
Box::new(Server::Node(
42+
String::from("Backup Root"),
43+
Box::new(Server::Empty),
44+
Box::new(Server::Empty),
45+
)),
46+
);
47+
48+
println!("{}", root_server);
49+
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ yer aldığı repodur.
1616
- [Ders 07 - Generic Türler](./Lesson_07/README.md)
1717
- [Ders 08 - Traits](./Lesson_08/README.md)
1818
- [Ders 09 - Closures](./Lesson_09/README.md)
19-
- [Ders 10 - Smart Pointers]()
19+
- [Ders 10 - Smart Pointers](./Lesson_10/Readme.md)
2020
- [Ders 11 - Threads]()
2121
- [Ders 12 - Channels]()
2222
- [Ders 13 - Macros]()

0 commit comments

Comments
 (0)