ввиду. Я понимаю что ансейв нужен и т.п. но когда почти все сейф методы оказываются обёртками ансейв методов без каких-то либо проверок и т.п. - для меня странно, что тогда даёт сейв метод мне как пользователю, что компилятор не ругается?
минимум дизайн кода раста позволяет сделать множество unsafe вещей safe. иначе как компилятор понимает где ругнуться)
А где ансейф обернут в сейф без проверок?
ну например String::from -> String::to_owned -> unsafe String::from_utf8_unchecked
Там на уровне типов должна быть гарантия. Ты, скорее всего, From для &str смотришь
https://doc.rust-lang.org/stable/src/alloc/str.rs.html#208-210 ты про это? для String::from_utf8_unchecked указан инвариант, при котором можно вызывать эту функцию: This function is unsafe because it does not check that the bytes passed to it are valid UTF-8. If this constraint is violated, it may cause memory unsafety issues with future users of the String, as the rest of the standard library assumes that Strings are valid UTF-8. self.as_bytes().to_owned() гарантированно содержит валидный UTF-8, поскольку содержит байты из &str
да, я не правильно написал но не суть, сейв ведёт в ансейв
тип String это самый обычный Vec<u8>, но! тип String имеет не просто Vec<u8> он имеет данные валидные UTF-8 кодировке. от этого мы имеем, slow функции проверяющие UTF-8, или unsafe создать String без проверки гарантии
да, ансейф обычно предваряется комментами вида "мы в курсе, что тут ансейф и он работает потому, что ..."
Обсуждают сегодня