Денис
не ту пасту открыл
Oleg
А если через итераторы?
Маjко
Ага. Если что, это пример написанный по куску реального кода, просто демонстрация Переписать на итераторах нельзя, надо обходить
Маjко
nll раздражает, что фолспозитивит варнинги на ненужную мутабельность
Маjко
Ладн, все равно к этому всё шло. Сделаю фич-гейт nightly на либу и включу nll на найтли
Маjко
На стейбле путь будет double-get
Andrey
Так чо на итераторах нельзя? Enumerate и filter-map не справляются?
Denys
так а что не так с v.iter_mut().find(|&&mut value| value == key) ?
Andrey
Ну я не знаю что ещё такого в for чего нет в iter. Вот и предположил.
Сергей
https://play.rust-lang.org/?gist=8a4acee95df38bf4cae22ba470b8f0e3&version=stable&mode=debug
Денис
два гета
Денис
ваще можно unchecked get делать и норм
Денис
а v[i] это типа совсем не get )
Aleksey
это лучше, чем get.unwrap :)
Денис
ну... нет
Денис
то же самое
Aleksey
лучше не в плане производительности тот же clippy ругается на get.unwrap
Денис
я тоже не про производительность
Сергей
перебирая i, ты не обойдёшься одним get
Денис
но ваще это какой-то жёсткий баг
Денис
бажина прям
Денис
return не делаешь, и всё компилится нормально
Denys
там выше уже написали, проблема с текущим борроучекером
Денис
делаешь return — приезжаешь
Denys
на нлл работает
Денис
да понятное дело
Денис
но всё равно обидно)
Denys
ну да)
Denys
но я все жду почему нельзя на итераторах
Denys
вариант
Aleksey
оно после первой итерации вернет
Cat
не, не то
Маjко
ваще можно unchecked get делать и норм
Он и есть в реальном коде
Денис
ну тогда по идее оба гета — фактически бесплатные вызовы
Маjко
@Renyare @nexmean двойной get не вариант, так и было изначально
Маjко
ну тогда по идее оба гета — фактически бесплатные вызовы
Нет, за ними есть логика. Это вопрос не на как переписать пример кода, а как объяснить borrowck что он не прав
Денис
океей
Денис
ну походу никак :(
Маjко
У меня там get ищет в бакете хешмапы, это далеко не бесплатно)
Денис
ну то есть всегда есть ансейф.. но.. :)
Маjко
ну то есть всегда есть ансейф.. но.. :)
Ансейф не отключает borrowck :)
Денис
разве?
Маjко
Ага
Денис
ну, всегда можно скатиться до поинтеров
Маjко
Только если так
Маjко
Но не, не хочу)
Денис
ну да, это перебор конечно
Сергей
ты хочешь иммутабельную ссылку превратить в мутабельную, но в общем случае так нельзя делать, т.к. компилятор мог соптимизировать под немутабельность
Сергей
в первом get
Маjко
Нет, нету там ее
Маjко
https://play.rust-lang.org/?gist=266f8da9b9ad391be7be67261745e455&version=stable&mode=debug
Сергей
можно наверное через mem::replace разрулить, хоть и некрасиво
qthree
https://play.rust-lang.org/?gist=266f8da9b9ad391be7be67261745e455&version=stable&mode=debug
https://play.rust-lang.org/?gist=c30de9138d9b1af45241af3f37a702e1&version=stable&mode=debug
Cat
ну всё равно же двойной гет
Cat
хотя мб .get() дешевле .get_mut()
qthree
вот чуть более понятная ошибка
Или так https://play.rust-lang.org/?gist=4a0365ce500fc4627c66d840f68fac46&version=stable&mode=debug
qthree
Да хоть тройной, компилятор выкинет лишние. Если там сайд эффектов нет от гета в реальном коде
Денис
сказали же, что двойной гет — не вариант
Денис
чё мусолить-то
Cat
мутабельную ссылку нужно возвращать, куда он её выкинет
Cat
моя интерпретация того, что компилятор пытается сделать: пытается мутабельную ссылку сохранить в анонимной переменной и вернуть её после выхода из функции borrowck не позволяет это сделать, т.к. на новом шаге цикла мы повторно захватываем вектор
qthree
get и get_mut только на уровне типов различаются, v ты не миняешь в процессе, скорее всего значение полученное от get в итоге и вернётся из функции
Cat
llvm-оведы, призываю вас
qthree
borrowchk'а не существует на уровне llvm
Cat
я обратного не утверждал
Cat
я могу подискутировать насчёт того, что до Spectre процессор мог наперёд проверить условие, и просто вернуть второй гет, опуская первый но, кажется, мы в ближайшее время не вернёмся в эту прекрасную эпоху
Денис
ну чисто гипотетически llvm может понять, что там два раза подряд происходит ровно одно и то же (с точностью до мутабельности возвращаемого значения, но llvm на это пофиг должно быть), и оптимизировать всё это дело
Денис
но это совсем не факт
Денис
может сделать, может не сделать
Денис
и расчитывать на это я бы не стал
Денис
я тоже