Rust 函数指针逆变

问题描述

我无法理解 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 有两个参数,'aT。它在 'a 上是协变的,在 T 上是不变的。