Как обрезать срез и получить индексы (индексы) результата? - PullRequest
1 голос
/ 11 июля 2020

Это похоже на простую проблему :

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

Изменить : исходную проблему легко решить напрямую , так что, вероятно, ответ в этом случае - сам себе. Возможно, мне стоит просто закрыть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...