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