问题描述
我无法理解 Rust 中的逆变。
特别是:
然而,同样的逻辑不适用于参数。考虑尝试 满足:
fn handle_animal(Animal);
与
fn handle_animal(Cat);
第一个函数可以接受Dogs,但第二个函数绝对
不能。协方差在这里不起作用。但是如果我们翻转它,它
实际上确实有效!如果我们需要一个可以处理 Cats 的函数,
可以处理任何 Animal 的函数肯定会正常工作。或者
将它与真正的 Rust 联系起来:如果我们需要一个可以处理的函数
任何至少可以存活 'long
的东西,它完全可以
能够处理至少 'short
的任何事物。
(来自:https://doc.rust-lang.org/nomicon/subtyping.html)
这是我无法理解的部分:
或者将其与真正的 Rust 联系起来:如果我们需要一个可以
处理任何至少存在 'long
的东西,这完全没问题
因为它能够处理至少存在 'short
的任何事物。
如果你在需要的地方传递 'short ' ,那么这不会不起作用,这意味着传递的 'short 不会活得足够长吗?
我知道当涉及到生命周期时,如果 'long: 'short
,那么 'long
是 'short 的子类型(因为 'long
是 'short
和更多),即使有考虑到这一点,我仍在努力解决上述问题..
有人能帮我弄明白吗?
此外,当谈到方差时,为什么我们说“结束”,例如:&mut T
是不变的结束 T'
?
解决方法
如果您将 'short
传递到需要 'long
的某个地方,这会不会不起作用,这意味着传递的 'short
不会存活足够长的时间吗?
相反。我们在需要 'long
的地方传入了 'short
,这很有效。
分解引用:
如果我们需要一个函数来处理至少 'long
我们需要一个可以接受 'long
的函数,这意味着我们必须将 'long
(甚至更长)传递给它。
它能够处理任何至少“短暂”的东西是非常好的
因此,我们有一个 'long
作为参数传递,以及一个接受 'short
的提供函数。没关系。该函数需要它至少存活 'short
并且它确实如此,因为它至少存活 'long
。
回答另一个问题:
此外,当谈到方差时,为什么我们说“over”,例如:&mut T is invariant over T'?
如果有多个参数,那么不同的参数可能会有不同的方差。
例如 &'a mut T
有两个参数,'a
和 T
。它在 'a
上是协变的,在 T
上是不变的。