• Как избежать дубликации кода реализуя Trait'ы в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    Написать derive макрос. Правда стоит соизмерить трудозатраты.
    Или написать обычный декларативный макрос (не так гибко как derive, но написать проще).

    А вообще, Rust не Java/C#, trait - не интерфейс.
    Если приведете не абстрактные примеры, вполне возможно, что задача решается проще.
    Ответ написан
    Комментировать
  • Нужно ли явно инициализировать все поля экземпляра класса в конструкторе?

    Vindicar
    @Vindicar
    RTFM!
    Тут пригодится принцип наименьшего удивления.
    Ситуация, когда набор атрибутов у объекта различается в зависимости от вызванных до
    этого методов - более удивительна, чем ситуация, когда набор атрибутов один и тот же, просто часть из них имеет значения по умолчанию.
    Ответ написан
    Комментировать
  • Почему возникает ошибка при вызове delattr?

    Vindicar
    @Vindicar
    RTFM!
    Потому в твоем коде q - это атрибут SomeClass, а не его экземпляров.
    В первом случае ты создал атрибут q у экземпляра a, а потом прочитал и удалил.
    Во втором случае ты попытался прочитать атрибут q на экземпляре, но его там нет. Поэтому язык начал искать атрибут в самом классе и нашел. А потом ты попытался удалить атрибут на экземпляре. Но его там нет.
    Ответ написан
    2 комментария
  • Как изменить данные завернутые в Box, который завернут в Option?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых стоит познакомится с такой конструкцией, как if let.
    Но здесь, с Box, у Вас не получится обойти borrow checker.
    Нормальным решением будет использовать счетчики ссылок (Rc или Arc) и избавиться с их помощи от зависимости на лайфтаймы. А для ссылки на parent нужно использовать Weak ссылку, чтоб она не влияла на подсчет ссылок.

    https://doc.rust-lang.org/std/rc/struct.Rc.html
    https://doc.rust-lang.org/std/rc/struct.Weak.html

    https://doc.rust-lang.org/std/sync/struct.Arc.html
    https://doc.rust-lang.org/std/sync/struct.Weak.html

    use std::rc::{Rc, Weak};
    
    pub struct Node {
        parent: Weak<Node>,
        data: u32,
        pub left: Option<Rc<Node>>,
        pub right: Option<Rc<Node>>,
    }
    
    #[derive(Debug)]
    pub struct SetChildError;
    
    impl Node {
        pub fn new(data: u32) -> Self {
            Self {
                parent: Weak::new(),
                data,
                left: None,
                right: None,
            }
        }
    
        pub fn set_left(self: &mut Rc<Self>, mut child: Rc<Self>) -> Result<(), SetChildError> {
            let child_mut = Rc::get_mut(&mut child).ok_or(SetChildError)?;
            child_mut.parent = Rc::downgrade(self);
    
            let self_mut = Rc::get_mut(self).ok_or(SetChildError)?;
            self_mut.left = Some(child);
    
            Ok(())
        }
    }
    Ответ написан
    5 комментариев
  • Что такое монадическая обработка ошибок?

    @Vitsliputsli
    Что такое монадическая обработка ошибок? И почему это круто?

    Очевидно использование монад для обработки ошибок. "Монада – это просто моноид в категории эндофункторов. Функтор – это гомоморфизм между категориями. А эндофунктор – это просто функтор, отображающий категорию на саму себя. "
    По-моему уже этого достаточно, чтобы ответить на 2ой вопрос.

    Объясните для человека не знакомого с функциональным программированием, в чем плюс отсутствия try-catch-finally.

    Монада - это попытка обойти ограничения функционального программирования, выполнять последовательные операции, т.е. делать то, что делается при императивном подходе из коробки. Т.е. монада специфична для функционального, а try-catch-finally для императивного, и последний в первый никак не запихнуть, поэтому - монада.
    Нет принципиальной разницы в этих методах обработки ошибок, ошибки идут отдельным потоком, разница лишь когда будет вызван обработчик.
    Насколько я знаю, для монад есть еще один аргумент - это убирание обработки ошибок "под капот", т.е. мы видим решение только тест-кейса основной бизнес-логики, а тест-кейсы ошибок скрыты. Если говорить про ООП, там это не проблема, при подобном структурировании обработчик ошибок будет именно там, где и должен быть, к примеру, если мы говорим о "File not found", то в классе отвечающем за инфраструктуру и в бизнес-логике мы его не увидим. Кроме того, мы можем задать общий обработчик, а не писать всюду try catch. Что касается процедурного подхода, то наверное абсолютно все спрятать не получится, но если мы в 22 году пишем процедурно, у нас приоритет не структуризация, а производительность и здесь уже другие критерии.
    Ответ написан
    8 комментариев
  • Что такое монадическая обработка ошибок?

    Монадическая обработка ошибок - это когда для представления результата операции, которая может закончиться ошибок, используется монада. Например Either (aka Result).

    В Go хоть и нет try-catch, но и монадической обработки ошибок тоже нет.

    Главнаый смысл монад в том, что ты не можешь напрямую молча её распаковать.
    А ещё есть функция map() с помощью которой можно безопасно обработать успешный результат.

    Хорошие примеры языков с такой системой - Haskell, F#, Ocaml, Rust.

    Также советую посмотреть на railroad oriented programming, ссылку на которую скинул Александр Скуснов.
    Ответ написан
    Комментировать
  • Что такое монадическая обработка ошибок?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Интересно обратываются ошибки I/O в Rust. Там такой синтаксис что ты не можешь получить результат не обработав ошибку. Является ли это монадической схемой? ХЗ.
    use std::fs;
    
    fn main() {
        let data = fs::read_to_string("/etc/hosts").expect("Unable to read file");
        println!("{}", data);
    }

    В других языках можно как-то проскочить между капелек дождя. Просто не делать секцию catch(exception) а здесь компиллятор просто не соберет код без except().

    Есть еще другой более красивый кейс с Rust но я его не найду никак.
    Ответ написан
    1 комментарий
  • Что такое монадическая обработка ошибок?

    alfss
    @alfss
    https://career.habr.com/alfss
    Посмотрите причину создания и основные требования к языку

    Ортогональность. Язык должен предоставлять небольшое число средств, не повторяющих функциональность друг друга.

    Простая и регулярная грамматика. Минимум ключевых слов, простая, легко разбираемая грамматическая структура, легко читаемый код.

    Простая работа с типами. Типизация должна обеспечивать безопасность, но не превращаться в бюрократию, лишь увеличивающую код. Отказ от иерархии типов, но с сохранением объектно-ориентированных возможностей.

    Отсутствие неявных преобразований.
    Ответ написан
    Комментировать
  • Что такое монадическая обработка ошибок?

    @AlexSku
    не буду отвечать из-за модератора
    Наглядные картинки в "железнодорожно-ориентированном" программировании.
    Ответ написан
    Комментировать
  • Что такое монадическая обработка ошибок?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Errors are values.
    Don't just check errors, handle them gracefully.
    (c) Rob Pike https://go-proverbs.github.io/
    Ответ написан
    Комментировать
  • Можно ли обойтись вообще без шаблонов в Django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Да, можно. Да, это нормальный поддерживаемый сценарий работы Django.
    Ответ написан
    Комментировать
  • Можно ли обойтись вообще без шаблонов в Django?

    @ATNC
    Full-stack web\python developer
    Конечно. Рендеринг шаблонов в Django - это всего лишь одна из батареек, которые вы можете использовать. В мире Single Page Application этой опцией Django никто не пользуется, потому-что для приложения нужно всего-лишь получить набор "сырых" данных, в основном в JSON формате. Вы можете построить свое приложение которое будет работать с JSON с помощью стандартных методов Django, но лучше всего для этого подходит Django Rest Framework. DRF позволит с минимальным количеством кода написать рабочее приложение для работы с VueJS. Вам нужно будет только сосредоточиться на бизнес логике, все остальное за Вас сделает DRF.
    Ответ написан
    Комментировать
  • Можно ли обойтись вообще без шаблонов в Django?

    @deliro
    Конечно. DRF используй, шаблоны вообще не нужны.
    Ответ написан
    Комментировать