2

我很难理解 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.

如果你在需要'long'的地方传递'short',这不会不起作用吗,这意味着传递的'short'不会活得足够长?

我知道,当谈到生命周期时,如果'long: 'short,那么'long是“短”的子类型(原样'long'short更多),即使考虑到这一点,我仍然在为上述问题苦苦挣扎。

有人可以帮我理解吗?

此外,当谈到方差时,为什么我们说“over”,如:&mut Tis invariant over T'

4

2 回答 2

5

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

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

分解报价:

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

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

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

所以,我们有一个'longto 作为参数传递,还有一个提供的函数接受'short. 没关系。该功能至少需要它活着,'short因为它至少活着'long

于 2021-02-03T04:34:34.463 回答
1

回答另一个问题:

另外,当谈到方差时,为什么我们说“over”,如:&mut T is invariant over T'?

如果有多个参数,那么不同的参数可能会有不同的方差。

例如&'a mut T有两个参数,'aT。它是协变的'a和不变的T

于 2021-02-03T21:30:09.430 回答