Вот код на С, который требует указателя и динамического выделения памяти:
struct Node
{
int data;
struct Node *next;
}
Тут как бы классика. И интересно как сделать то же самое на Rust.
GPT дал версию с использованием системных Option и Box, что мне не интересно, т.к. не раскрывает внутреннего устройства как это работает. По сути Option и Box ничем не отличаются от умных указателей в С++, по этому как бы в чем преимущество языка — мне не ясно.
А без Option и Box вариант такой:
struct Node {
data: i32,
next: *mut Node,
}
impl Node {
fn new(data: i32) -> Self {
Node { data, next: std::ptr::null_mut() }
}
}
fn main() {
let mut third_node = Node::new(3);
let mut second_node = Node::new(2);
let mut first_node = Node::new(1);
first_node.next = &mut second_node;
second_node.next = &mut third_node;
// Использование связанного списка
let mut current_node = &first_node;
while !current_node.next.is_null() {
println!("Node data: {}", current_node.data);
current_node = unsafe { &*current_node.next };
}
}
Но! Как оказалось — этот код требует ручной очистки памяти.
И тут я совсем запутался — в чем же преимущество Rust? Ведь В С++ тоже есть умные указатели.
Можно ли получить лаконичный пример где Rust бьет C++ и видны его преимущества? Я не вижу преимуществ Option и Box по сравнению с умными указателями.