стоит использовать Box. В книге приводятся два примера использования - хранение ?Sized, например dyn Trait, и рекурсивные типы, но что мешает в данных случаях использовать & или &mut?
Ничто не мешает, но с ссылками работать, как правило, неудобно
ясно, спасибо
8 минут про умные указатели Box
Пример из ролика и в книге есть, вопрос был в том зачем реализовывать рекурсивный тип через Box: enum List { Cons(i32, Box<List>), Nil, } если можно через &: enum List<'a> { Cons(i32, &'a List<'a>), Nil, }
Разница в том что в млучае со ссылкой надо этот объект где-то хранить еще
play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=18910d95febeef775d9c80230e4d2e3b тут в переменной хранится первый List, на остальные есть только ссылки
А где хранятся объекты, на которые они ссылаюттся?
еще нюанс - box держит данные в куче а не в стеке, поэтому эти данные могут пережить выход из скопа где были созданы
Что бы взять ссылку на dyn Trait сначала нужно эту структуру куда-то положить.
Так на стэк можно положить... let iter = [1].iter(); let _: &dyn Iterator<Item = &i32> = iter;
Ссылки - это не owned тип, а часто хочется, чтобы было и ?Sized и Owned.
Обсуждают сегодня