let foo = Some(Foo::default());
let foo = None; // Would this line trigger `Foo::drop`?
Нет, конец блока будет.
Помните, что let
является переменной объявлением , поэтому вторая строка не изменяетсяпервый foo
, он создает новый foo
, который скрывает первый.Но он все еще существует (и к нему можно получить доступ, если вы создали ссылку на него до второго let
) до конца блока, поэтому он будет отброшен в конце блока.
Если вы хотитечтобы на самом деле изменить переменную, вы должны сделать
let mut foo = Some(Foo::default());
foo = None;
Теперь она немедленно вызовет удаление, потому что старое значение перезаписывается, поэтому оно должно удалить его.