LexsZero
а что за комикс-то?
LexsZero
можно в лс
Мерль
LexsZero
thx
Oleg
есть ли способ, не создавая новых struct ов
Oleg
сделать последовательно три вещи
Oleg
1. Инициализировать String внутри функции
2. Прочитать в неё read_line
3. Вернуть оттуда Iterator, который заимствует этот стринг
Маjко
А стринг у тебя останется где, лол?
Маjко
Заимствовать нечего будет после выхода из функции
Oleg
Oleg
Но оказывается так тоже не прокатит
Oleg
Поэтому я и ищу какое-то знаете, решение
Oleg
Есть какая-то встроенная структура, которая сохраняет значение, и хреноту, произведённую из заимствованной ссылки на него?
Маjко
Ты изобретаешь какой-то велосипед.
Мухи отдельно, котлеты отдельно.
Сначала инициализируешь, потом другой функцией берешь нужный итератор от заимствованой строки
Oleg
Маjко
Как ты представляешь иначе?
Можешь структуру-контекст передавать
Loyd
Маjко
Откуда вообще такое нежелание создавать новые типы?
Это какая-то болезнь пришельцев из динамических языков прямо. Никак ребята не могут понять что типы тут не вносят оверхэд
Oleg
Loyd
Но оказывается так тоже не прокатит
Конечно, не прокатит. Ты когда вернёшь строку, то она вполне может переместиться, а значит ссылка просрётся. Но ты ведь это и так понимаешь, к чему это всё?
Loyd
Loyd
Щас
Маjко
Loyd
https://kimundi.github.io/owning-ref-rs/owning_ref/index.html
Loyd
вот
Oleg
Давайте контекстно, вот нубокод для кодфорсес.
https://gist.github.com/Odomontois/eca1e93c48b406c608a134b272071d72
Есть подсказки, как начать превращать это в структ
Oleg
Oleg
Oleg
Вот, что я только что попытался написать
https://gist.github.com/Odomontois/eca1e93c48b406c608a134b272071d72#file-vecreader-rs
Oleg
Как результат - does not live long enough
Oleg
Как мне создать структуру, одна часть которой ссылается на другую?
Loyd
Loyd
Догадаешься почему?
Oleg
Т.е. моя структура должна состоять только из строчки
Oleg
и итератор должен возвращаться методом, так?
Loyd
Ну, ты можешь хранить смещение и на каждый next() по смещению доставать
Loyd
Только неясно зачем
Loyd
Итератор это итератор. Коллекция это коллекция. Зачем их смешивать?
Oleg
А я могу попросить раст вывести type IntoIter в своём impl?
Loyd
Да
Loyd
impl Trait, но это пока unstable
Oleg
неее
Oleg
про impl Trait я вроде как знаю, но мне нужно очень stable, на уровне 1.12 stable
Loyd
Ну, тогда либо явно тип прописывать, либо структуру-алиас создавать, либо боксить (https://is.gd/f5AMhw)
Oleg
Loyd
В чём проблема явно указать итератор?
Loyd
Это же не производный вроде Map/Filter
Oleg
Oleg
Map< , Split>
Loyd
Только только оборачивать, увы
Loyd
Почему такой древний раст (1.12)?
Oleg
Loyd
Если ты про то, что хочешь везде иметь просто Iterator и разруливать динамической диспетчеризацией, как в скале, то это (а) накладные расходы, (б) теряешь возможность делать разные свойства вроде ExactSize, Copy и прочие
Loyd
Тогда можешь описать в типе через fn(i32) -> i32
Oleg
Т.е. сейчас это замыкание
.map(|a| a.trim().parse().unwrap()))
Oleg
но, наверное, можно и в fn вынести
Loyd
Вынеси в функцию и опиши её
Oleg
Другая проблема
Loyd
Да забоксируй ты
Loyd
Для сабжа это неважно
Loyd
А там, где важно (реальный код), там можно и impl Trait юзать )
Oleg
Для сабжа это неважно
ну я хочу типа вынести, и получить "ах какой перфоманс", на этой дурацкой задаче, чтобы понимать как правильно делать
Oleg
Я правильно понимаю, что я могу сделать только один IntoIter ?
Loyd
Ага
Loyd
"ах какой перформанс" ты не получишь — ты уже юзаешь parse(), то есть кучу по полной
Loyd
А, я не знаю по что parse
Loyd
Мб в число, ок
Oleg
Danila Matveev
fn main() {
let a = [0, 1, 2, 3, 4, 5, 6, 7];
let middle = &a[3..4];
let (c, b) = (middle[0], middle[1]);
println!("Hello, world! {} {}", c, b);
}
Возможно решится, когда выкатят https://internals.rust-lang.org/t/lang-team-minutes-const-generics/5090
Oleg
Oleg
что, вообще, логично
Oleg
вектор i64 по объёму полюбому меньше текста, хранящего их десятичное представление через пробел
Stanislav
Oleg
Oleg
i64 - 8 байт
десятичная запись - 18 байт на цифры + 1 байт на пробел