В документах не упоминается, что Option<T>
реализует Drop
, потому что он не реализует его.
Черта Drop
необходима, только если вы хотите, чтобы ваша структура или перечисление имели некоторые особое поведение.Если вам нужно только освободить память и запустить деструкторы дочерних элементов, компилятор сделает это самостоятельно.С соответствующей страницы в Rustonomicon :
Если структура не имеет специальной логики для удаления, кроме удаления своих дочерних элементов, то это означает, что Drop
не нужнобыть реализованным вообще!
Option
не имеет реализации Drop
, потому что в его уничтожении нет специальной логики, в отличие от Rc
(который уменьшает счетчик ссылок) или с MutexGuard
(который разблокирует родительский мьютекс).Вы можете наблюдать то же поведение с вашими собственными типами, Bar
s в struct Thingie(Bar, Bar)
будут отбрасываться так же, как если бы они были заключены в Some
.
Обратите внимание, что везде над "X" нет Drop
реализация "на самом деле означает отсутствие реализации - компилятор не сделает ее неявным образом.
Вы также можете напрямую проверить, реализует ли тип Drop
или нет:
fn test_for_drop<T: Drop>() { }
fn main() {
test_for_drop::<Option<i32>();
}
Playground
Выдает ошибку:
error[E0277]: the trait bound `std::option::Option<i32>: std::ops::Drop` > is not satisfied
--> src/main.rs:4:5
|
4 | test_for_drop::<Option<i32>>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::ops::Drop` is not implemented for `std::option::Option<i32>`
|
note: required by `test_for_drop`
--> src/main.rs:1:1
|
1 | fn test_for_drop<T: Drop>() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^