Я заметил, что Box<T>
реализует все, что T
реализует и может использоваться прозрачно.Например:
let mut x: Box<Vec<u8>> = Box::new(Vec::new());
x.push(5);
Я бы хотел сделать то же самое.
Это один из вариантов использования:
Представьте себе, что я 'm пишу функции, которые работают с использованием оси X и оси Y. Я использую значения для изменения оси, которая имеет номера типа, но принадлежит только одной или другой оси.
Я бы хотел, чтобы мой компиляторпотерпеть неудачу, если я попытаюсь выполнить операции со значениями, которые не принадлежат хорошей оси.
Пример:
let x = AxisX(5);
let y = AxisY(3);
let result = x + y; // error: incompatible types
Я могу сделать это, создав структуру, которая будет переносить числа:
struct AxisX(i32);
struct AxisY(i32);
Но это не даст мне доступ ко всем методам, которые i32
предоставляет, например abs()
.Пример:
x.abs() + 3 // error: abs() does not exist
// ...maybe another error because I don't implement the addition...
Еще один возможный вариант использования:
Вы можете присвоить себе структуру другой библиотеки и реализовать или получить что-то еще, что захотите.Например: структура, которая не выводит Debug
, может быть обернута и добавить реализацию для Debug.