172 похожих чатов

Привет, изучаю раст, столкнулся с тем как лучше захендлить опциональные

вещи. Написал код ниже, это кусочек решения для задачи с литкода, сначала я написал fn overflow через анвреп с дефолтом, но из-за того что я пока не до конца понимаю владение, влепил клон (т.к. это бокс то по идее клониться будет весь хвост линкед листа что не круто), плюс нужна имплементация дефолт, потом я подумал как бы избавиться от него, и придумал влепить вместо этой конструкции еще один матч. Я хочу понять какое решение более "идеоматическое" и в целом более грамотное, почему, можно ли сделать лучше (в конструкции с матч меня как то коробит что два разных вызова конструктора ноды хотя код выглядит чисто). Может быть как-то можно переписать вариант типа анврепа только без клонирования и покрасивее?

* для контекста, функция приводит лист типа [1, 10, 9, 1] к [1, 9, 0, 2]

rust

#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>,
}

type Node = Option<Box<ListNode>>;

impl Default for Box<ListNode> {
fn default() -> Self {
Box::new(ListNode::new(0))
}
}

fn node(val: i32, next: Node) -> Node {
Some(Box::new(ListNode { val, next }))
}

/// using unwrap and clone
fn overflow(l: Node) -> Node {
match l {
None => None,
Some(b) if b.val < 10 => Some(b),
Some(b) => node(
b.val - 10,
overflow(node(
b.next.clone().unwrap_or_default().val + 1,
b.next.unwrap_or_default().next)),
),
}
}

/// using match
fn overflow(l: Node) -> Node {
match l {
None => None,
Some(b) if b.val < 10 => Some(b),
Some(b) => node(
b.val - 10,
overflow(match b.next {
None => node(1, None),
Some(next) => node(next.val + 1, next.next),
}),
),
}
}

7 ответов

30 просмотров

а оно вообще работает? Или ты написал просто как хочешь чтобы было

izucken- Автор вопроса
Αλεχ Zhukovsky
а оно вообще работает? Или ты написал просто как х...

работает корректно, разница в производительности в пределах погрешности (ну на литкоде...)

izucken
работает корректно, разница в производительности в...

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=42171403097f777a3e9355856b4d2e34 ну вот я посмотрел - как было 1 10 9 1 так и осталось

izucken- Автор вопроса
Αλεχ Zhukovsky
а оно вообще работает? Или ты написал просто как х...

я немного не так описал функцию, т.к. это часть решения, но вопрос у меня все же больше про то как работать с опциями

у тебя получается ерунда потому что линкед листы так никто не описывает. А так второй способ с матчем достаточно идеоматичный

izucken- Автор вопроса
Αλεχ Zhukovsky
у тебя получается ерунда потому что линкед листы т...

ну листы такие автор задачи дает т.ч. не поспоришь )

izucken- Автор вопроса

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта