Прежде всего, этот вопрос у вас есть, что collect
о создании новой коллекции , тогда как срез касается ссылки на смежный диапазон элементов в существующем массиве (будь он динамически распределен или нет).
Я боюсь, что из-за характера признаков, тот факт, что оригинальный контейнер (STRHELLO
) был непрерывный диапазон был потерян, и не может быть восстановлена после факта. Я также опасаюсь, что любое использование «универсальных» итераторов просто не может привести к желаемому результату; тип системы должен был бы как-то нести тот факт, что:
- оригинальный контейнер был смежный диапазон
- цепь операций, выполняемых до сих пор сохраняют это свойство
Это может быть выполнимо или нет , но я не вижу, чтобы это делалось сейчас, и я не уверен, каким образом это может быть элегантно реализовано.
С другой стороны, вы можете это сделать в сделай себе путь:
fn take_while<'a>(initial: &'a [u8], predicate: |&u8| -> bool) -> &'a [u8] { // '
let mut i = 0u;
for c in initial.iter() {
if predicate(c) { i += 1; } else { break; }
}
initial.slice_to(i)
}
И потом:
fn main() {
let subslice: &[u8] = take_while(STRHELLO, |c|(*c==b'H'));
println!("Expecting: {}, Got {}",STRHELLO.slice_to(3), subslice);
assert!(subslice == STRHELLO.slice_to(3));
}
Примечание: 'H' as u8
можно переписать как b'H'
как показано здесь, которое симметрично со строками.
Человек, отличный ответ! В то время, когда мне потребовалось, чтобы я сидел здесь и подозревал, что ответ может быть чем-то вроде этого, вы фактически внедрили его. Возможно, iter() на срезах может вместо этого возвращать подклассы, содержащие один элемент за раз, и тогда у вас может быть что-то вроде сбора, который повторно объединяет избыточные подклассы? –
@AndrewWagner: Честно говоря, я просто не знаю, что здесь может быть API. –
Все еще просто spitballing, но если моя общая идея работает, возможно, все, что вам нужно, это каждый()? сгенерировать итератор, а может быть, splice() объединить все вместе? возможно, сращивание возвращает итератор срезов для несмежных результатов ... –