如何解决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
有两个参数,'a
和 T
。它在 'a
上是协变的,在 T
上是不变的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。