По сложной проблеме, без которой невозможно обойтись без небезопасных блоков, содержится в ссылках структуры на что-то, принадлежащее другому атрибуту этой структуры.Небезопасные ссылки на атрибуты одной и той же структуры
Однако небезопасных блоков, это довольно легко, можно сделать что-то вроде:
struct Foo {
bar: &'static str,
foo: String
}
impl Foo {
pub fn new(s: String) -> Foo {
Foo {
bar: unsafe { ::std::mem::transmute(&s[..]) },
foo: s
}
}
}
Вот вопрос: не представила метод структуры Foo
ранее определенной дает &mut
доступ к нему (в-структуру таким образом, никогда не будет изменен после создания), зная, что данные String
выделены в виде кучи, действительно ли этот код безопасен (в соответствии с значением ржавчины «безопасным»)? Если нет, то в каких ситуациях может возникнуть проблема?
Я вижу. Таким образом, если все поля являются частными, и единственный доступ к содержимому осуществляется с помощью метода, например 'pub fn get_str <'a> (& 'a self) -> &' a str {& self.bar}', что может пойти не так, как надо ? – Levans
@ Levans Много вещей, я бы сделал ставку. Или, может быть, вообще ничего. Как я уже сказал, я не в своей глубине: я могу указать на дыры в безопасности, как я их нахожу, но не найти никого не дает мне большой уверенности. – delnan
Да, это имеет смысл. – Levans