Rust 函数指针逆变

Nim*_*oor 2 contravariance rust invariance

我无法理解 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 ' long ,这不是不起作用,这意味着传递的 'short 不会活得足够长吗?

我知道,当涉及到寿命,如果'long: 'short,然后'long是“短亚型(如'long'short多),即使考虑到这一点,我还在上述挣扎..

有人可以帮我理解一下吗?

另外,当谈到方差时,为什么我们说“结束”,例如:&mut T不变结束 T'

Jef*_*ett 5

如果你通过'short某个需要的地方'long,那岂不是'short不行,这意味着被传入的人活得不够长吗?

这是相反的。我们在'long需要 a的地方传入a 'short,这很有效。

分解报价:

如果我们需要一个至少可以处理任何存在的东西的函数 'long

我们需要一个可以接受的函数'long,这意味着我们必须有'long(甚至更长的时间)我们将要传递给它。

它能够处理任何至少“短暂”的东西,这完全没问题

因此,我们有一个'longto 作为参数传递,以及一个接受'short. 没关系。该函数至少需要它存活,'short而且它确实如此,因为它至少存活'long.