rust - 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
.
如果你在需要'long'的地方传递'short',这不会不起作用吗,这意味着传递的'short'不会活得足够长?
我知道,当谈到生命周期时,如果'long: 'short
,那么'long
是“短”的子类型(原样'long
和'short
更多),即使考虑到这一点,我仍然在为上述问题苦苦挣扎。
有人可以帮我理解吗?
此外,当谈到方差时,为什么我们说“over”,如:&mut T
is invariant over T'
?
解决方案
如果你通过
'short
某个它需要的地方,这不是行不通吗'long
,这意味着'short
被传入的人不会活得足够长?
这是相反的。我们正在传递 a'long
我们需要 a 的地方'short
,这很有效。
分解报价:
如果我们需要一个可以处理任何至少可以存活的函数
'long
我们需要一个可以接受的函数'long
,这意味着我们必须有'long
(甚至更长)我们要传递给它。
能够处理至少“短暂”的任何事物,这完全没问题
所以,我们有一个'long
to 作为参数传递,还有一个提供的函数接受'short
. 没关系。该功能至少需要它活着,'short
因为它至少活着'long
。
推荐阅读
- c# - 将组合框项添加到对象列表并写入 txt 文件
- c# - 在 C# 中,是否允许编译器将浮点文字“升级”为双倍?
- java - JSONObject getString 在第一次运行时返回 null
- r - 从融化的数据框中绘制等高线图
- javascript - 使用 Vanilla javascript 设置元素高度等于宽度
- java - 确定 Java 程序中 GDI 对象数量的最佳方法是什么?
- flutter - 如何在颤振中自定义小部件
- scala - 使用 scala 从 IntelliJ 连接到 Azure CosmosDB 时无法绕过代理
- java - 构造两个字符的模式(例如:“aabba”、“aba”)
- view - 如何为两个模型创建一个控制器?