什么是Rust的准确的自动解引用规则?

您所在的位置:网站首页 rust自动解引用 什么是Rust的准确的自动解引用规则?

什么是Rust的准确的自动解引用规则?

#什么是Rust的准确的自动解引用规则?| 来源: 网络整理| 查看: 265

你的伪代码非常正确。对于这个例子,假设我们有一个方法调用foo.bar()在哪里foo: T。我将使用完全限定的语法(FQS)明确表示方法被调用的类型,例如A::bar(foo)或A::bar(&***foo)。我只是要写一堆随机大写字母,每一个都只是一些任意的类型/特征,除了T总是foo调用该方法的原始变量的类型。

该算法的核心是:

对于每个“取消引用步骤” U(即设置U = T,然后U = *T......) 如果存在bar接收方类型(方法中的类型self)U完全匹配的方法,请使用它(“按值方法”)否则,添加一个auto-ref(接收器&或&mut接收器),并且如果某个方法的接收器匹配&U,则使用它(“autorefd方法”)

值得注意的是,一切都考虑方法的“接收器类型”,不是对Self性状的类型,即impl ... for Foo { fn method(&self) {} }想着&Foo匹配的方法时,并fn method2(&mut self)会考虑&mut Foo匹配时。

如果在内部步骤中有多个特征方法有效(即在1或2中只能有零个或一个有效特征方法,但每个特征方法对于每个特征方法都有效,那么这是一个错误:从1开始将被采用),固有方法优先于特征方法。如果我们到达循环的结尾而没有找到任何匹配的东西,那也是一个错误。递归Deref实现也是错误的,这会使循环无限(它们会达到“递归限制”)。

这些规则似乎在大多数情况下都是这样做的,虽然具有编写明确的FQS表单的能力在某些边缘情况下非常有用,并且对于宏生成的代码来说是非常有用的错误消息。

只有一个自动引用被添加,因为

如果没有绑定,事情会变得很糟糕/缓慢,因为每种类型都可以有任意数量的引用采取一个引用&foo保持与foo(它是它foo自己的地址)的强连接,但承担更多的开始丢失它:&&foo是存储的栈上的一些临时变量的地址&foo。例子

假设我们有一个电话foo.refm(),如果foo有类型:

X,那么我们开始U = X,refm有接收器类型&...,所以步骤1不匹配,采取一个自动参考给我们&X,这与(与Self = X)匹配,所以这个调用是RefM::refm(&foo)&X,以第一步(带)U = &X匹配开头, 因此呼叫是&selfSelf = XRefM::refm(foo)&&&&&X,这两个步骤都不匹配(该特征没有针对&&&&Xor 实现&&&&&X),所以我们取消引用一次得到U = &&&&X,匹配1(with Self = &&&X),并且调用是RefM::refm(*foo)Z,不匹配任何一步,所以它被解除引用一次,得到Y,也不匹配,所以它又被解除引用,得到X,它不匹配1,但在自动修复后匹配,所以调用是RefM::refm(&**foo)。&&A,1不匹配,2也不匹配,因为该特征未针对&A(针对1)或&&A(针对2)实施,所以它被解除引用&A,与1匹配,与Self = A

假设我们有foo.m(),那A不是Copy,如果foo有类型:

A,然后U = A匹配self直接使呼叫M::m(foo)与Self = A&A,然后1.不匹配,而且也不2.(均未&A也不&&A实现性状),因此它被解除引用到A,它不匹配,但M::m(*foo)需要考虑A由值,因此移动出foo,因此错误。&&A,1.不匹配,但autorefing给出&&&A,它确实匹配,所以调用M::m(&foo)与Self = &&&A。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3