Anton
бгг
Anton
пока меня не начал пиздить лайфтайм чекер, а я невыспавшийся и засыпающий пытался фиксить
Anton
блеть
Маjко
но вены не вскрывают, вены вскрывают их пользователи
Ой, да ладно. Большая часть того, чем ты пользуешься написана на Си. Просто больше времени уходит на отладку и поддержку кода, вот и все
Anton
Я кстати заценил эту фичу с подсказками по коду и пробелмам от компилятора
Anton
реально помогало не мало
Anton
ну и rls для vscode пиздато пашет
Anton
еще никогда меня не хуисосил компилятор, хотя как по мне лучше уж компилятор чем как в всяких питуонах прям в рантайме
Anton
кек
Anonymous
а rustc только на английском работает?
Anonymous
ну это понятно
Anonymous
мне интересно просто
Berkus
можешь впилить туда gettext() и свой перевод при желании
Амир
https://gist.github.com/anonymous/82e7216dcd72f00f1f14896aec2eacaf Пожалуйста, подскажите как можно изменить text="Your Name: "; на свою переменную, вычисленную в блоке fn main(){} Пытаюсь создать мутабельную статическую переменную и изменить её значение через Unsafe, получаю "does not live long enough"...
Anonymous
lazy_static?
Амир
Есть метод https://gabdube.github.io/native-windows-gui/api/native_windows_gui/struct.TextInput.html#method.set_text но я не знаю как его использовать
Berkus
input.set_text("text")?
Амир
input.set_text("text")?
error[E0599]: no method named set_text found for type AppId in the current scope --> src\main.rs:240:15 | 240 | NameInput.set_text("123"); | ^^^^^^^^
Berkus
тип явно не тот
Ivan
Оппа, всем привет! А здесь нубские вопросы можно задавать?
Berkus
ну да, мы этим и занимаемся)
Ivan
Я чёт не понял. Деструктор или drop автоматически вызывается?
adam
Я уверен, что в первом томе это подробно рассматривалось.
adam
Ivan
От души!
Berkus
ну да, если Drop имплементирован то он будет вызван
Berkus
если нет - ну дефолтная деструкция тогда
Ivan
А что за по умолчанию?
Berkus
ну так же - если поля имеют Drop то он у них вызывается, если нет - то у них тоже дефолтная деструкция
Ivan
Окей
Ivan
То есть, если есть Drop, дефолтной не будет?
Ivan
Может должно быть и то и то?
Berkus
думаю дефолтная тоже будет но после дропа
Berkus
надо в Книге смотреть
Berkus
https://doc.rust-lang.org/book/second-edition/ch15-03-drop.html
Ivan
Да, это было бы логично
Berkus
я так понимаю что если ты импельментируешь Drop то оно перестает само освобождать ресурсы
Ivan
Это же плохо
Ivan
Утечек памяти не будет?
Berkus
хз, надо рыться
Berkus
или послушать старших товарищей, где они кстати
Loo
даже не знаю в чём тут разбираться
Loo
https://doc.rust-lang.org/std/ops/trait.Drop.html#tymethod.drop
Loo
After this function is over, the memory of self will be deallocated.
Loo
чёрным по белому
Berkus
про переменные в self ничего не сказано
Berkus
еще раз, struct Some { a: Vec<String>, b: Vec<String>, } Drop { drop() { drop(self.a); } }; что будет с b?
Loo
у тебя этот код не скомпилтся
Loo
https://doc.rust-lang.org/std/mem/fn.drop.html
Loo
посмотри на сигнатуру
Oleg
Это же раст
Oleg
Пока нет unsafe - ничего никуда не утечет
Loo
ещё раз - данный код не скомпилится. дропнуть отдельно часть структуры ты не можешь потому что она во владении self
Loo
поля струткуры дропаются вместе с самой структурой и никак иначе - в нормальных ситуациях
Oleg
Да, пардон, я о другом говорил :)
Loo
данный пример не скомпилируется лишь потому что функция std::mem::drop принимает ВЛАДЕНИЕ
Anonymous
аааааааааа
Anonymous
вообще-то скомпилится если не использовать структуру потом
Loo
вообще-то скомпилится если не использовать структуру потом
ещё раз. функция std::mem::drop - принимает владение. при попытке передать владение поля a произойдёт ошибка на этапе компиляции. потому что полем a владеет self.
Anonymous
drop(self.a) ведет себя так же как drop(self)
Oleg
drop(self.a) ведет себя так же как drop(self)
Там фишка в том, что у трейта Drop метод drop принимает мутабельную ссылку :) Мы не владеем self, поэтому в drop передать поле не можем.
Oleg
Ах да, надо было начать с "еще раз"
Oleg
я по этому коду ориентируюсь
Я так и понял, я просто уже успел в плейграуде проверить :))
Anonymous
непонятно что там должно было быть написано
Berkus
ещё раз. функция std::mem::drop - принимает владение. при попытке передать владение поля a произойдёт ошибка на этапе компиляции. потому что полем a владеет self.
окей, это я понял. как работает тогда Arc<> - он декрементит счетчик в self, значит чтобы указатель автоматически не дропался - он лежит в unsafe, так?
Loo
сходу ответить не мог поэтому глянул сорс
Loo
пока количество стронг ссылок не равно единице - они просто декрементятся и делается ретёрн обычный
Loo
дальше если по условию прошло
Loo
вызывается https://doc.rust-lang.org/src/alloc/arc.rs.html#816
Loo
drop_slow в unsafe
Loo
который уже weak насколько я понял разбирает
Loo
https://doc.rust-lang.org/src/alloc/arc.rs.html#503
Berkus
хм, почитаю, пока не очень понятно. понятно что если drop() имплементировать руками - то никакой деаллокации не происходит (пока не позовешь mem::drop(self)?)
Loo
https://doc.rust-lang.org/std/ops/trait.Drop.html#tymethod.drop