LINUX.ORG.RU

Строки в RUST

 


0

6

Есть вопрос по строкам (str не String) в Rust, насколько я понял строки это по сути теже масивы (&[u8]) но со своими особенностями.

И все было более мение понятно пока я не попытался разобраться в деталях работы/реализации вот этого метода (часть документации):

fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> 
where
    I: SliceIndex<str>
А именно меня здесь настараживает 'str' в случае с range Взято отсюда: https://doc.rust-lang.org/std/primitive.str.html

Я пошел смотреть исходники libcore (1.16.0) и во первых я не нашел там объявления этого метода, зато есть get для SliceExt:

fn get<I>(&self, index: I) -> Option<&I::Output>
        where I: SliceIndex<Self::Item>;

Во вторых имплиментация SliceIndex (для Range) указывает Output тип как:

type Output = [T];
Тоесть получается что <I as SliceIndex<str>>::Output - должен быть массив строк (а не строка).

Может ктото растолковать где я запутался ?

★★★★

Ответ на: комментарий от MyTrooName

Да спасибо уже сам разобрался, в 1.16 get для str вообще не объявлен, в 1.19 - все сходится (там все переписали похоже)

zaz ★★★★
() автор топика

Метод get для str выглядит так:

    pub fn get<I: SliceIndex<str>>(&self, i: I) -> Option<&I::Output> {
        core_str::StrExt::get(self, i)
    }

Дальше идем в StrExt и смотрим там:

    fn get<I: SliceIndex<str>>(&self, i: I) -> Option<&I::Output> {
        i.get(self)
    }

Дальше идем в SliceIndex<str>:

    impl SliceIndex<str> for ops::Range<usize> {
        type Output = str;

        fn get(self, slice: &str) -> Option<&Self::Output> {
            if self.start <= self.end &&
               slice.is_char_boundary(self.start) &&
               slice.is_char_boundary(self.end) {
                Some(unsafe { self.get_unchecked(slice) })
            } else {
                None
            }
        }
    }

И тут видно что Output это строка.

pftBest ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.