Перво-наперво, это не имеет никакого отношения к контролеру заимствований.То, что один тип не совпадает с другим, относится к проверке type .
Существует ли какой-либо безопасный или небезопасный способ передачи test
в качестве аргумента SerializeChar
, аналогичный простому приведению в C ++?
Через необработанные указатели
Преобразуйте его в следующую последовательность:
&mut i8
*mut i8
*mut u8
&mut u8
fn serialize_char(value: &mut u8) {
*value = std::u8::MAX
}
fn main() {
let mut test: i8 = 0;
serialize_char(unsafe { &mut *(&mut test as *mut i8 as *mut u8) });
println!("{}", test); // -1
}
См. Также:
transmute
Использование as
всегда должно быть вашей первой попыткой, но есть также Большой Молот transmute
.Это позволяет вам совершать всевозможные плохие поступки по сравнению с более простой последовательностью приведений as
и не рекомендуется при наличии альтернативы:
use std::mem;
fn serialize_char(value: &mut u8) {
*value = std::u8::MAX
}
fn main() {
let mut test: i8 = 0;
serialize_char(unsafe { mem::transmute(&mut test) });
println!("{}", test); // -1
}
См. Также:
Безопасность
Все преобразования через as
безопасны, хотя они могут выдавать поддельные или неожиданные данные.
Преобразование из *mut u8
в &mut u8
или использование transmute
небезопасно, поскольку программист должен убедиться, что:
- соблюдены правила ссылок
- все значения действительнызначения для их типов
Мы знаем, что ссылка действительна: есть только одна изменяемая ссылка, и она указывает на действующие данные.
A u8
и i8
оба действительны для любого 8-битного набора битов, даже если семантические значения могут изменяться, как показывает то, как u8::MAX
становится -1
.
Все это, как говорится, не означаетчто нет лучших способов достичь своей цели.Как Лейни упоминает , вы можете создать черту для интересных типов и скрыть небезопасный код внутри реализаций.Это позволяет вашим пользователям избегать небезопасной работы.
Вы также можете использовать макрос для создания нескольких похожих функций, фактически не делая их одинаковыми.
Вероятно, существует и более высокий уровень решения вашей реальной проблемы.Почему вы должны изменить данные здесь?Это кажется очень необычным для сериализации.