Я просматривал и обновлял зависимость opencv в своем проекте Rust. Из-за некоторых критических изменений функции, которые раньше возвращали Mat, теперь возвращают BoxedRef<Mat>. Как мне вернуть базовый Mat без клонирования? Вот пример пары строк кода:
pub fn crop(input: &Mat, x: i32, y: i32, width: i32, height: i32) -> opencv::Result<Mat, RipsError> {
let cropped = Mat::roi(input, Rect::new(x, y, width, height))?;
Ok(cropped)
}
Теперь возвращает ошибку:
Type mismatch [E0308] expected `Mat`, but found `BoxedRef<Mat>`
Можно ли как-нибудь «unwrap» выделить Mat из BoxedRef?





Вы не можете.
Семантически BoxedRef<'_, Mat> эквивалентен общей ссылке &'_ Mat, поэтому вы не можете просто взять на себя ответственность за нее.
Эти методы, возвращающие Mat ранее, были просто необоснованными (как говорит нам журнал изменений версии 0.89.0):
- Некоторые функции, в частности
Mat::roi(), теперь возвращают оберткуBoxedRef<Mat>вместо, казалось бы, независимойMat. Это устраняет старую дыру в корректности, поскольку возвращаемыйMatна самом деле был представлением исходного кодаMat, и вы могли легко получить две изменяемые ссылки на одну и ту же память. Для каждой такой функции генерируется дополнительный*_mut(), возвращающий изменяемыйBoxedRefMut<Mat>. Чтобы получить две изменяемые ссылки на одну и ту жеMatдля непересекающихся регионов, используйте новую функциюMat::roi_2_mut().
Это неудачно :/