31

Rust のドキュメントのマーカー セクションと、サブタイプバリアンスに関するウィキペディアの記事を何度も閲覧したのに、ライフタイムのサブタイプ関係の理解が深まらなかったことに、私はばかげているように感じます。

「Cat <: Animal」は「Cat は Animal のサブタイプである」を意味し、「S は T のサブタイプである」は「任意の用語 S を安全に使用できる」を意味する「典型的な OOP スタイル」のサブタイイング関係に慣れていると思います。タイプ T の項が期待されるコンテキストで使用されます。」ここまでは順調ですね。

しかし、これは生涯にどのように適用されるのでしょうか? 現在Rustで定義されている方法はどうやら(*)

(#1) 'a <: 'b <=> 寿命 a は寿命 b より長くありません。

と、「もちろんそういうことだ!」と思われるかもしれません。おそらく、<: がより小さい演算子に似ているため、または「サブ」がサブセットを考えさせ、短い寿命は確かに長い寿命のサブセットであるためです。しかし、'a が 'b より長くない場合、'a は本当に'bのサブタイプですか? ウィキペディアのサブタイプ関係の定義を適用してみましょう。

(#2) 'a <: 'b <=> ライフタイム a は、ライフタイム b が期待されるコンテキストで安全に使用できます。

私が抱えている問題は、これを調整できないことです。2位から1位になる方法は?私には、これは矛盾しているように思えます...何かが少なくともbの間生きていると予想し、bよりも短い寿命aを持つものがある場合、寿命bを持つものがあるコンテキストでは明らかにそれを使用できません必須ですよね?それは私だけですか、それともライフタイムのサブタイプ関係が間違っているのでしょうか?

#rust編集: (*) IRC チャネルの Ms2ger によると、これは事実です。また、反復子で使用される反変ライフタイム マーカーに関するドキュメントにも適合しItemsます。

Edit2: ContravariantLifetime および CovariantLifetime マーカーが削除されました。現在、マーカーモジュールPhantomDataの代替品として用意されています。

4

1 に答える 1