Alexey
Anonymous
где она спокойно вышла из new
Sergey
я про твой пример
ну а там что?
структура создалась
в методе на структуре паника
вызывается деструктор
Сережа
я вас затроллел, насколько я понимаю если будет реальный файл - то это будет растовская структура а для неё дроп уже вызовется и хендл файла ос закроется
Anonymous
так я и спрашиваю почему деструктор вызывается если паника
Sergey
Anonymous
как это влияет
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
второе синтаксический сахар для первого
Vladimir
Сережа
Он хендл дропнул
хендл это структура? все равно все сводится к инту как в си, в реализации собственной обертки над файлом можно допустить такую ошибку
Vladimir
Vladimir
Сережа
ладно
Vladimir
В расте не принято работать с паниками, так что не страшно
Vladimir
Ты точно так же можешь безопасно утечь файлом без дропа
Vladimir
Течь безопасно
Vladimir
Vladimir
С вложенными паниками?
Vladimir
Ну тоесть "бросанием исключений"
Alexey
вложенные паники - это что конкретно?
Сережа
когда исключение возбуждается в конструкторе класса, считается что экземпляр еще не создан и деструктор для него не надо вызывать
Сережа
2 паники = std::terminate
Alexey
но надо вызвать (в с++) деструктору у того, что успело сконструироваться (поля, локальные переменные)
Сережа
в расте 2 паники это тоже наверное завершение программы
Vladimir
Сережа
все равно все ваши паники поверх плюсовых исключений
Vladimir
Vladimir
Сережа
кто его читал
Сережа
там 1500 страниц
Vladimir
Я про то, что создаётся объект в конструкторе неявно
Alexey
1000+ страниц - это со стандартной либой. ядро языка - меньше
Vladimir
Подразумевается что он уже существует когда конструктор вызывается, ведь ты имеешь указатель на него
Сережа
а дроп в расте явно вызывается
Сережа
ты или крестик сними или штаны надень
Vladimir
Safort
Sergey
ну Эшли ж интересуется
doc
Я слышал, в Rust система типов настолько выразительная и строгая, что компилятору удается про некоторое количество ARC-managed объектов доказать, что счетчик ссылок падает до нуля в одном конкреном месте при любом исполнении программы, и полностью заменить и инкременты / декременты счетчика, и сам счетчик, и всю дополнительную косвенность (лишние указатели на указатели), и заменить это все на чистые malloc / free в нужных местах.
Не знаю, насколько это правда и как часто происходит на практике.
doc
Посоны такое бывает? Звучит как сказка
Nikolay
IDA в помощь
Nikolay
Правда, нужно поревёрсить скомпилированный код и посмотреть что там происходит
Nikolay
Хотя, теоретически, учитывая механизмы времени жизни, и невозможности создавать множественные мутабельные ссылки, это может оказаться правдой
Vladimir
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)
}
}
а почему не так?