Я чувствую себя глупо для просмотра раздела маркеров документации Rust и статей в Википедии о subtyping и variance, не улучшая моего понимания отношения подтипов жизни.
Я думаю, что я просто привык к типичным отношениям подтипов типа ООП типа "Cat <: Animal", что означает "Cat - подтип Animal", где "S является подтипом T" означает "любой термин S можно безопасно использовать в контексте, где ожидается срок типа T". Пока все хорошо.
Но как это относится к временам жизни? То, как оно определено сейчас в Rust, очевидно (*)
(# 1) 'a <:' b <= > время жизни a не больше, чем время жизни b.
И вы можете подумать: "Конечно, что это значит!" возможно, потому, что <: похоже на меньшее, чем оператор, или, возможно, потому, что "sub" заставляет вас думать о подмножествах, а более короткая продолжительность жизни - это, конечно, подмножество более продолжительной продолжительности жизни. Но "действительно ли это подтип" b, если "a не больше, чем" b "? Попробуйте применить определение Wikipedia отношения подтипа:
(# 2) 'a <: b <= > lifetime a можно безопасно использовать в контексте, где ожидается ожидание b.
Проблема в том, что я не могу смириться с этим. Как вы получаете от № 2 до №1? Потому что для меня это кажется противоречием... Если вы ожидаете, что что-то живое по крайней мере b, и у вас есть что-то с пожизненным временем, которое короче b, вы, очевидно, не сможете использовать его в этом контексте, когда что-то с пожизненным временем b требуется, не так ли? Является ли это только мной, или мы получили неверное отношение подтипирования для времен жизни?
Изменить: (*) Согласно Ms2ger в канале #rust
IRC, это так. Он также соответствует документации на контравариантном маркере времени жизни, который используется в итераторе Items
.
Edit2: маркеры ContravariantLifetime и CovariantLifetime были удалены. Теперь мы имеем PhantomData
в качестве замены в модуле marker.