Anton
ребят
Anton
а по поводу хакатона
Ilya
Смотри, замени переменную на вектор
Anton
если чо в питере и тд, куда можно запинить сообщение о хакатоне то
Anton
в ниженм так то есть it52
Anton
а по остальным каналам чо?
Ilya
Если его мутируешь - то он переаллоцирует память и ссылка уже в другое место будет указывать
Anton
Так я ссылаюсь не на его часть
Anton
А на вектор целиком
Anton
прост если реально есть желающие поучаствовать, надо бы как то организовать и инфу раскинуть и тд
Ilya
если чо в питере и тд, куда можно запинить сообщение о хакатоне то
Погоди пару дней, определимся точно с датой и тогда найдем каналы
Ilya
У меня есть несколько вариантов
Ilya
+ есть люди которые могут нам помочь
Anton
Там просто время жизни иммутабельных ссылок это вызов функции inspect
Anton
И компилятор вроде видит, что на момент, когда я их беру, их никто не может менять
Cat
а, я не в ту сторону пример развернул, ща
Anton
То есть, грубо говоря мутабельная ссылка может считаться иммутабельной во всех местах, кроме передачи её в мутирующую подфункцию
Anton
Или я неправ?
Ilya
Господи, как мне не хватает матклада
Ilya
Честно, не знаю)
Cat
math treasure?
Anton
Ну чисто по логике если подумать
Ilya
Я только знаю что компилятор этого не любит и приывк такие моменты обходить стороной
Anton
Мне просто очень не хватает таких правил в текущем расте
Anton
И я думаю, можно ли запилить свой раст с куртизанками, где можно будет так делать)
Cat
так, стоп
Anton
Без ансейфа нет
Cat
аааа
Cat
ну короче я просто неправильно понял вопрос
Cuno
То есть, грубо говоря мутабельная ссылка может считаться иммутабельной во всех местах, кроме передачи её в мутирующую подфункцию
Единственность мутабельной ссылки не просто так требуется. Конверть в &mut ровно перед вызовом этих самых функций.
Cat
я думал у тебя как раз получилось сделать immut + mut borrowing
Anton
тогда я подожду инфу
Anton
если чо будет пиши
Anton
или сюда или в лс, помогу чем смогу, все остальное по организации и плюшкам на проведение могу взять на себя включая интернет и тд)
Cat
почему?
Cuno
nll фиксит же только класс ошибок, которые решаются правильной постановкой областей видимости.
Cat
всё так
Ilya
Чтобы убедится в том что не фиксит, достаточно его включить и с грустью смотреть на ошибку компиляции)
Cuno
Но это же perfectly safe, нет?
В данном конкретном случае - да, но в общем случае - нет.
Anton
Почему?
Anton
Мы же по дереву вызовов всегда точно видим, где реально могут мутации происходить
Cuno
Почему?
Мутабельность ссылки это пруф того, что нет других указателей на переменную -> нет инвалидации никаких других указателей. Как ты с множеством указателей эту проблему решишь?
Cat
так он же вроде как раз про скопы
Cat
захват в render(), отпускание, захват mutable, отпускание, repeat
Anton
Мутабельность ссылки это пруф того, что нет других указателей на переменную -> нет инвалидации никаких других указателей. Как ты с множеством указателей эту проблему решишь?
Ну у нас всё происходит внутри функции. Мы всегда знаем, что если отдали её как немутабельную, на чтение, её вернут назад перед вызовом другой
Cat
это к изначальному вопросу ( вот этому https://play.rust-lang.org/?gist=00b1a11ffbcf79e00d2c29614c423bd0&version=stable )
Cuno
Ну у нас всё происходит внутри функции. Мы всегда знаем, что если отдали её как немутабельную, на чтение, её вернут назад перед вызовом другой
Пример. Допустим ты взял иммутабельную ссылку: let a = &vec[0] а затем передал мутабельную в функцию f(&mut vec). Вектор переаллоцируется и иммутабельная ссылка сломается.
Cat
(вмешиваюсь посередине разговора) конеш, но это про другое
Anton
Ну тут явно надо отпустить сначала a, она же по лайфтайму связана
Ilya
Кстати, не против заглянуть
Не вопрос, будем рады) если что пиши в лс.
Cuno
В моём примере иммутабельные отпускаются по выходу из inspect
Проблема в том, что это в общем случае нереально отследить.
Cat
граница в том, что "ссылки" при возврате из функции "отпускаются", и не будут ломаться при дальнейшем переиспользовании
Cat
если ссылки явно объявлены, то понятно, так нельзя
Cat
а если это просто вызов функции с возвратом, то почему бы и нет
Anton
Проблема в том, что это в общем случае нереально отследить.
Ну то есть проблема не в том, что так нельзя, а в том, что отследить нельзя?
Cuno
Но в этом немного смысла
Cat
fn bar() { let mut data = vec!['a', 'b', 'c']; let slice = &mut data[..]; // <-+ 'lifetime capitalize(slice); // | data.push('d'); // ERROR! // | data.push('e'); // ERROR! // | data.push('f'); // ERROR! // | } // <------------------------------+
Anton
Ну я пока не смог придумать примера, в котором это было бы невалидно
Cuno
Это действительно другое.
Cuno
решается постановкой скобочек
Cat
ну тогда ок, я не прав значит
Anton
Тут типа у них скоуп закрывается слишком поздно
Cat
решается постановкой скобочек
на самом деле не всегда
Anton
А я хочу сделать скоуп дырявым
Anton
Потому что по дереву вызовов чётко видно, где мутирующие скоупы