Anonymous
где она спокойно вышла из new
Sergey
я про твой пример
ну а там что? структура создалась в методе на структуре паника вызывается деструктор
Сережа
я вас затроллел, насколько я понимаю если будет реальный файл - то это будет растовская структура а для неё дроп уже вызовется и хендл файла ос закроется
Anonymous
так я и спрашиваю почему деструктор вызывается если паника
Anonymous
как это влияет
Vladimir
v.drain(..).collect() (Vec) когда эта штука будет аллоцировать память?
Ну смотря где, автор того поста ругался про аллокацию стека, так что каждый метод будет выделять
Sergey
ну метод же захватил &self
Sergey
при панике вызывается Drop на структурках
Sergey
https://doc.rust-lang.org/beta/std/ops/trait.Drop.html
Vladimir
как это влияет
Потому что паника разворачивает стек по дефолту
Anonymous
и при развороте все дропы вызываются?
Sergey
> Given that a panic! will call drop as it unwinds, any panic! in a drop implementation will likely abort.
Vladimir
и при развороте все дропы вызываются?
Это и называется развернуть стек
Anonymous
а, ок
Alexey
А есть какие-то отличия от C++ тут? (ну, кроме того, что Drop это трайт)
Anonymous
потому что метод не статический
к слову в расте нет различия между статическими и фабрическими методами
Anonymous
второе синтаксический сахар для первого
Sergey
к слову в расте нет различия между статическими и фабрическими методами
я знаю но привычными словами проще объяснять ))) (я понял что ты имеешь ввиду)
Сережа
Он хендл дропнул
хендл это структура? все равно все сводится к инту как в си, в реализации собственной обертки над файлом можно допустить такую ошибку
Anonymous
Что такое фабричные методы?
в ооп это методы прикрепленные к инстансу
Сережа
ладно
Vladimir
В расте не принято работать с паниками, так что не страшно
Vladimir
Ты точно так же можешь безопасно утечь файлом без дропа
Vladimir
Течь безопасно
Alexey
В с++ что-то определено?
В смысле? Как отрабатывают деструкторы - определено.
Vladimir
С вложенными паниками?
Vladimir
Ну тоесть "бросанием исключений"
Alexey
вложенные паники - это что конкретно?
Сережа
когда исключение возбуждается в конструкторе класса, считается что экземпляр еще не создан и деструктор для него не надо вызывать
Сережа
2 паники = std::terminate
Alexey
но надо вызвать (в с++) деструктору у того, что успело сконструироваться (поля, локальные переменные)
Сережа
в расте 2 паники это тоже наверное завершение программы
Сережа
все равно все ваши паники поверх плюсовых исключений
Alexey
Вот вот, при этом в с++ это неявно
э? про это вроде явно написано в стандарте :-)
Сережа
кто его читал
Сережа
там 1500 страниц
Vladimir
Я про то, что создаётся объект в конструкторе неявно
Alexey
1000+ страниц - это со стандартной либой. ядро языка - меньше
Vladimir
Подразумевается что он уже существует когда конструктор вызывается, ведь ты имеешь указатель на него
Сережа
а дроп в расте явно вызывается
Сережа
ты или крестик сними или штаны надень
Vladimir
а дроп в расте явно вызывается
Так raii зачем дроп явно
Sergey
ну Эшли ж интересуется
doc
Я слышал, в Rust система типов настолько выразительная и строгая, что компилятору удается про некоторое количество ARC-managed объектов доказать, что счетчик ссылок падает до нуля в одном конкреном месте при любом исполнении программы, и полностью заменить и инкременты / декременты счетчика, и сам счетчик, и всю дополнительную косвенность (лишние указатели на указатели), и заменить это все на чистые malloc / free в нужных местах. Не знаю, насколько это правда и как часто происходит на практике.
doc
Посоны такое бывает? Звучит как сказка
Nikolay
IDA в помощь
Nikolay
Правда, нужно поревёрсить скомпилированный код и посмотреть что там происходит
Nikolay
Хотя, теоретически, учитывая механизмы времени жизни, и невозможности создавать множественные мутабельные ссылки, это может оказаться правдой
Vladimir
если тривиальные случаи игнорировать где просто Arc::new(val)
Vladimir
тогда llvm может убрать лишние атомик_инстрикт вызовы
Маjко
Бля
Маjко
Кто там кговонил
Маjко
Кто чтоб
Маjко
Набухаться в гов но
Маjко
Надо ехать на думскую
Маjко
Ху там
Маjко
@Mosolov Соси хуй
Vladimir
тебе нормально, да?
Anonymous
Хах
Sherzod
Алексей
у кого то классно прошла ночь ? ))
Sergey
Ребзя
Sergey
как избежать дублирования кода
Sergey
Sergey
или оставить только Into<String> ?
Max
Макросы?
Sergey
в случае From я сделал так
Sergey
макросы это прям такое
Victor
enum Loading { A, B } fn converter<'a>(so: &Loading) -> &'a str { match *so { Loading::A => "warning", _ => "error" } } impl Into<String> for Loading { fn into(self) -> String { converter(&self).to_string() } } impl<'a> Into<&'a str> for Loading { fn into(self) -> &'a str { converter(&self) } } а почему не так?