LexsZero
а что за комикс-то?
LexsZero
можно в лс
Мерль
LexsZero
thx
Oleg
compile time проверки тут даже делать довольно глупо: слишком редкий кейс
Готов признать поражение, если ты научишь меня правильно возвращать значения в расте
Oleg
есть ли способ, не создавая новых struct ов
Oleg
сделать последовательно три вещи
Oleg
1. Инициализировать String внутри функции 2. Прочитать в неё read_line 3. Вернуть оттуда Iterator, который заимствует этот стринг
Маjко
А стринг у тебя останется где, лол?
Маjко
Заимствовать нечего будет после выхода из функции
Oleg
Заимствовать нечего будет после выхода из функции
Вот, поэтому я хотел возвращать туплы
Oleg
Но оказывается так тоже не прокатит
Oleg
Поэтому я и ищу какое-то знаете, решение
Oleg
Есть какая-то встроенная структура, которая сохраняет значение, и хреноту, произведённую из заимствованной ссылки на него?
Маjко
Ты изобретаешь какой-то велосипед. Мухи отдельно, котлеты отдельно. Сначала инициализируешь, потом другой функцией берешь нужный итератор от заимствованой строки
Маjко
Как ты представляешь иначе? Можешь структуру-контекст передавать
Loyd
Готов признать поражение, если ты научишь меня правильно возвращать значения в расте
Ну нет же, кто же так спорит? Ты же там линию гнул, отстаивал что-то, а теперь вот так будет продавать одно за другое? Не, ты недочитал статью про демагогию на лурке прочёл, попробуй ещё раз.
Маjко
Откуда вообще такое нежелание создавать новые типы? Это какая-то болезнь пришельцев из динамических языков прямо. Никак ребята не могут понять что типы тут не вносят оверхэд
Oleg
Откуда вообще такое нежелание создавать новые типы? Это какая-то болезнь пришельцев из динамических языков прямо. Никак ребята не могут понять что типы тут не вносят оверхэд
я чувствую в себе пока слабость. Просто тип я создал. А вот хитрый тип с лайфтайм-параметрами пока у меня плохо выходит
Loyd
Но оказывается так тоже не прокатит
Конечно, не прокатит. Ты когда вернёшь строку, то она вполне может переместиться, а значит ссылка просрётся. Но ты ведь это и так понимаешь, к чему это всё?
Loyd
Щас
Маjко
я чувствую в себе пока слабость. Просто тип я создал. А вот хитрый тип с лайфтайм-параметрами пока у меня плохо выходит
Да тут не нужен хитрый. Просто тип и ассоциированная функция, возвращающая итератор от хранимой строки
Loyd
https://kimundi.github.io/owning-ref-rs/owning_ref/index.html
Loyd
вот
Oleg
Давайте контекстно, вот нубокод для кодфорсес. https://gist.github.com/Odomontois/eca1e93c48b406c608a134b272071d72 Есть подсказки, как начать превращать это в структ
Oleg
Вот, что я только что попытался написать https://gist.github.com/Odomontois/eca1e93c48b406c608a134b272071d72#file-vecreader-rs
Oleg
Как результат - does not live long enough
Oleg
Как мне создать структуру, одна часть которой ссылается на другую?
Loyd
Догадаешься почему?
Oleg
Т.е. моя структура должна состоять только из строчки
Oleg
и итератор должен возвращаться методом, так?
Loyd
Ну, ты можешь хранить смещение и на каждый next() по смещению доставать
Loyd
Только неясно зачем
Loyd
Итератор это итератор. Коллекция это коллекция. Зачем их смешивать?
Loyd
на самом деле мне хватило бы вернуть какой-то Iterator, овнящий стрингу
Ну, итераторы, которые овнят есть: это IntoIterator-ы (например: https://is.gd/ATNn6X)
Oleg
А я могу попросить раст вывести type IntoIter в своём impl?
Loyd
Да
Loyd
impl Trait, но это пока unstable
Oleg
неее
Oleg
про impl Trait я вроде как знаю, но мне нужно очень stable, на уровне 1.12 stable
Loyd
Ну, тогда либо явно тип прописывать, либо структуру-алиас создавать, либо боксить (https://is.gd/f5AMhw)
Loyd
В чём проблема явно указать итератор?
Loyd
Это же не производный вроде Map/Filter
Oleg
Map< , Split>
Loyd
Только только оборачивать, увы
Loyd
Почему такой древний раст (1.12)?
Loyd
Если ты про то, что хочешь везде иметь просто Iterator и разруливать динамической диспетчеризацией, как в скале, то это (а) накладные расходы, (б) теряешь возможность делать разные свойства вроде ExactSize, Copy и прочие
Loyd
codeforces.com
Почему-то так и подумал, лол
Oleg
Только только оборачивать, увы
Но у меня гипотетически простая функция в Map, т.е. без замыканий
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
"ах какой перформанс" ты не получишь — ты уже юзаешь parse(), то есть кучу по полной
Ну я хочу получить типа меньше мемори футпринт, чем промежуточный вектор
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
вектор i64 по объёму полюбому меньше текста, хранящего их десятичное представление через пробел
Oleg
шо
что не так?
Oleg
i64 - 8 байт десятичная запись - 18 байт на цифры + 1 байт на пробел