Alex
Some(c).into_iter()
expected type `std::str::Chars<'_>` found type `std::option::IntoIter<char>`
Vladimir
А, тебе прям Chars, а не итератор чаров
Vladimir
Тогда через стрингу
Alex
а как забиндить
Alex
второй день пишу на хрусте
Vladimir
Покажи код
Alex
foo.chars().flat_map(|x| match x { 'a' => "AAA".chars(), _ => x.to_string().chars(), }).collect()
Vladimir
Скорее всего это не сделать, потому что Chars борровед итератор
Vladimir
Замени вторую часть на panic!();
Vladimir
Мне просто интересно какой лайфтайм там выведет, Статик шоли?
Alex
вторую это какую
Vladimir
Та что "aaa".chars()
Vladimir
Тоесть наоборот, её оставь
Vladimir
Короче, ничего не делай, ща зайду с компа
Vladimir
короче смотри: 1) Chars<'a> это итератор который заимствует, значит то из чего он сделан должно жить столько, сколько живет чарс (т.е. до коллекта) 2) В случае "AAA" у тебя исходная строка статик, а значит чарс столько же живет 3) в случае to_string() у тебя создается временная строка, которая потом исчезает юзай фолд будет оптимальнее)
Alex
ага
Vladimir
еще конечно можно как я в начале писал, только в матче итераторы привести к общему итератору)
Vladimir
через бокс или через енам
պլհկ
either есть на крейтсах
պլհկ
Имплементит итератор
Vladimir
ну или так, чтоб своих велосипедов не городить
Vladimir
но в любом случае, оптимальнее фолдом попихать
Alex
гм, а почему вот такое работает foo.chars().map(|x| match x { 'a' => "AAA".into(), _ => x.to_string(), }).collect()
Vladimir
это массив строк
Alex
а точно
Vladimir
а ты хотел одну строку
Alex
там коллект же его склеивает в конце
Vladimir
"abc".chars().flat_map(|x| match x { 'a' => vec!['A','A','A'].into_iter(), _ => vec![x].into_iter(), }).collect(); }
Vladimir
вот такое тоже работает х)
Alex
отоночо
Alex
ну я фолд написал но оно немного коряво выглядит с push_str в каждом бранче
Alex
бранчей то там больше одного в реале :)
Vladimir
let s: String = "abc".chars().flat_map(|x| match x { 'a' => Box::new("AAA".chars()) as Box<Iterator<Item=char>>, _ => Box::new(Some(x).into_iter()) as Box<Iterator<Item=char>>, }).collect();
Vladimir
и даже такое работает х)
Vladimir
и даже такое "abc".chars().flat_map(|x| match x { 'a' => Either::Left("AAA".chars()), _ => Either::Right(Some(x).into_iter()), }).collect();
Vladimir
что самое оптимальное)
Vladimir
ну после фолда)
Alex
лан остановимся на катаморфизме знач
Сережа
а это точно удобнее и читаемее циклов?
Alex
а это точно удобнее и читаемее циклов?
ТЫ НЕ ЛЮБИШЬ ФУНКЦИОНАЛЬЩИНУ? КАК ТЫ МОЖЕШЬ!
Alex
читаемость в глазах смотрящего
Сережа
Сколько там джава процентов на рынке софта занимает?
Alex
чо, в 8ю вон тоже лямбды уже завезли
Сережа
и остается еще вопрос эффективности, раст же эффективный язык, да?
պլհկ
зачем делать Some() если есть once?
Маjко
Box::new это каждый символ будет давать выделение на куче
Ну и в релизе оно скорее всего выкинется
Сережа
т.е. на стеке выделится память под 1 Either(L,R) (это енум растовский?)
Сережа
и на каждом шаге он будет переиспользоваться?
Vladimir
зачем делать Some() если есть once?
Зачем делать once, есть есть Some?
Alex
а есть годболт для раста?
Vladimir
да
Сережа
ладно ты победил, на дизассемблер я смотреть не хочу
Alex
нехилые простыни он выдает однако
Vladimir
вообще, там должно быть всё просто, каждый раз, когда у дочернего итератора дергают .next() на вершине бектрейса забирается один символ, он упакуется в эйзер, позже распаковывается, и снова получается символ, который позже пихается в строку тем же push
Сережа
бэктрейс это когда стек вызовов распечатывается?
Сережа
а как же мне тут рассказывали, что итераторы в расте инлайнятся, какой-то магией
Маjко
Они в цикл превращаются
Vladimir
ну это уже по желанию ллвм
Маjко
Ща найду примерчик
Маjко
Забавный
Сережа
чем отличается "превращаются в цикл" и "инлайнятся"? я не троль!
Маjко
Маjко
@c_vld @Mosolov что будет быстрее?
Маjко
Или будут ли они равны по скорости
Маjко
Ваши варианты)
Vladimir
да скидывали уже
Сережа
ну по идее 1, там вроде выделяется память на хипе за раз
Маjко
Нет
Сережа
навскидку
Vladimir
где там на кипе)
Маjко
Сережа
Vec::with_capacity?
Vladimir
ну точнее где там за раз
Сережа
это создать вектор с зарезервированной на хипе области
Vladimir
кинь код текстом
Сережа
точно, надо сделать чтобы был 1 вектор