Size: a a a

Rust — русскоговорящее сообществo

2020 March 26

p

polunin.ai in Rust — русскоговорящее сообществo
а что, так и не решили проблему с tokio::sync::mspc в Intellij idea?
источник

ph

pl 🦑 hk in Rust — русскоговорящее сообществo
чем str::find не подошел?
источник

Э

Эрик in Rust — русскоговорящее сообществo
pl 🦑 hk
чем str::find не подошел?
Он ищет &str в другом &str, а я не могу гарантировать, что там валидный utf8 в тексте, в котором ищу.
источник

Э

Эрик in Rust — русскоговорящее сообществo
То есть у меня есть несколько &str и один большой &[u8], и я ищу первые во втором.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Ну вот базовая реализация алгоритма поиска подстроки в строке
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3bac8372976d01d618508a96c6048a23
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Если тебе интересно, можешь замерить.
Я ставлю на то, что то что уже есть сейчас (memchr + приложить в этой позиции), выиграет везде или почти везде
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
(это алгоритм Кнута-Морриса-Пратта)
источник

Э

Эрик in Rust — русскоговорящее сообществo
Спасибо.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но даже не знаю. Текст предполагается реальный, а не синтетический, много раз подряд не должны одни и те же байты повторяться. Может и простого memchr по первому байту хватит.
источник

В

Вафель in Rust — русскоговорящее сообществo
Так, напомните, а какой самый удобоваримый способ преобразовать Iterator<Item = String> в String заджойнив строки с разделителем?
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
Но даже не знаю. Текст предполагается реальный, а не синтетический, много раз подряд не должны одни и те же байты повторяться. Может и простого memchr по первому байту хватит.
Там смысл не в повторении, а в возможности прыгнуть больше чем на один символ
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
Так, напомните, а какой самый удобоваримый способ преобразовать Iterator<Item = String> в String заджойнив строки с разделителем?
Зависит от эффективности .collect для данного итератора. Если высокая, то просто:

let vec_of_strs = iter.collect();
vec_of_strs.iter().map(|s| s.as_str()).collect().join('_')
источник

Э

Эрик in Rust — русскоговорящее сообществo
Хотя не самый эффективный, даже не близко. Но просто написать.
источник

r

red75prime in Rust — русскоговорящее сообществo
Вафель
Так, напомните, а какой самый удобоваримый способ преобразовать Iterator<Item = String> в String заджойнив строки с разделителем?
itertools::intersperse  и collect
источник

В

Вафель in Rust — русскоговорящее сообществo
red75prime
itertools::intersperse  и collect
спасибо
источник

В

Вафель in Rust — русскоговорящее сообществo
Хотя раз уж Itertools тащить, то можно и join оттуда заюзать
источник

r

red75prime in Rust — русскоговорящее сообществo
Ну или if let Some(mut first) = iter.next() { for s in iter { first.push_str(separator); first.push_str(s); } first } else { String::new() }
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну а если хочешь поэффективнее, то что-то такое:

let size = {
 let (low, high) = iter.size_hint();
 let s = if let Some(size) = high {
   size
 } else {
   cmp::max(low,MEDIUM_ITERATOR_SIZE)
 };
 s * (UPPER_MEDIUM_STRING_SIZE + SPLITTER_SIZE)
};

let mut buffer = String::with_capacity(size);

iter.for_each(|s| {
 buffer.push_str(s.as_str);
});
источник

Э

Эрик in Rust — русскоговорящее сообществo
SPLITTER_SIZE - очевидный &str.len() или char.encode_utf8().len(), если чар, а не строка. А вот две другие цифры просто так не получить. ITERATOR_SIZE можно получить, если iter: ExactSizeIterator, а вот среднюю длину строки намного сложнее получить.
источник

В

Вафель in Rust — русскоговорящее сообществo
tl;dr: .iter().join(",").as_str()
источник