Это похоже на простую проблему :
let slice = " some wacky text. ";
let trimmed = slice.trim();
// how do I get the index of the start and end within the original slice?
Попытка 1
Ищите альтернативный API. trim
обертывает trim_matches
, который в любом случае имеет дело с индексами внутренне: давайте скопируем этот код! Но здесь используется std::str::pattern::Pattern
, который нестабилен, поэтому его нельзя использовать вне std
в стабильном Rust.
Попытка 2
Просто используйте trim
и вычислите индексы срезов по указателям. Есть хороший метод as_ptr_range
, но он тоже нестабилен; к счастью, поскольку PR говорит, что есть простой обходной путь.
let slice_ptr = slice.as_ptr();
let trimmed_ptr = trimmed.as_ptr();
// don't bother about the end (we can use trimmed.len())
Теперь, когда у нас есть указателей, нам нужна их разница. sub
- это не правильный метод для этого. offset_from
есть, но он нестабилен (как отмечено в дизайне, его единственное допустимое использование - это сравнение двух указателей на один и тот же фрагмент, что именно то, что мы хотим сделать, к сожалению, это еще одна задержка. по деталям).
Теперь есть есть более хакерских способов решения этой проблемы. Мы могли бы преобразовать указатели в usize
(мы знаем, что размер элемента равен 1 байту, поэтому умножать не нужно). Но, скорее всего, это небезопасный тип Undefined Behavior, поэтому не давайте здесь go.
Попытка 3
Изменить : исходную проблему легко решить напрямую , так что, вероятно, ответ в этом случае - сам себе. Возможно, мне стоит просто закрыть это.