文档章节

auto deref or auto ref ?

曾赛
 曾赛
发布于 2015/02/06 15:06
字数 369
阅读 89
收藏 0
trait Double {
    fn double(self) -> usize;
}

impl<'a> Double for &'a String {
    fn double(self) -> usize { self.len()}
}

impl<'a, 'b, 'c> Double for &'a &'b &'c String {
    fn double(self) -> usize { self.len() * 2 }
}

pub fn main() {
    let x = "hello".to_string(); println!("x:String     => {}", x.double());
    let x = &x;                  println!("x:&String    => {}", x.double());
    let x = &x;                  println!("x:&&String   => {}", x.double());
    let x = &x;                  println!("x:&&&String  => {}", x.double());
    let x = &x;                  println!("x:&&&&String => {}", x.double());
}

OUTPUT:

x:String     => 5
x:&String    => 5
x:&&String   => 10
x:&&&String  => 10
x:&&&&String => 10

how the compiler decide the ord of auto-deref or auto-ref?

if we remove &&&String version of impl:

trait Double {
    fn double(self) -> usize;
}

impl<'a> Double for &'a String {
    fn double(self) -> usize { self.len()}
}

pub fn main() {
    let x = "hello".to_string(); println!("x:String     => {}", x.double());
    let x = &x;                  println!("x:&String    => {}", x.double());
    let x = &x;                  println!("x:&&String   => {}", x.double());
    let x = &x;                  println!("x:&&&String  => {}", x.double());
    let x = &x;                  println!("x:&&&&String => {}", x.double());
}

OUTPUT:

x:String     => 5
x:&String    => 5
x:&&String   => 5
x:&&&String  => 5
x:&&&&String => 5


if we remove the &String version of impl:

trait Double {
    fn double(self) -> usize;
}

impl<'a, 'b, 'c> Double for &'a &'b &'c String {
    fn double(self) -> usize { self.len() * 2 }
}

pub fn main() {
    let x = "hello".to_string(); println!("x:String     => {}", x.double());  // error
    let x = &x;                  println!("x:&String    => {}", x.double());  // error
    let x = &x;                  println!("x:&&String   => {}", x.double());
    let x = &x;                  println!("x:&&&String  => {}", x.double());
    let x = &x;                  println!("x:&&&&String => {}", x.double());
}


总结:在做x的方法搜索时,最多只会做一次自动引用,然后就一直做自动解引用。当为一个变量x找搜索方法f时,具体算法如下:

1、当前x上是否有方法f,有调用之;

2、没有,则在x上自动引用一次变成&x,&x上如果有方法f,则调用之;

3、没有,则尝试*x,一直重复3步,直到找到或失败。



© 著作权归作者所有

共有 人打赏支持
曾赛

曾赛

粉丝 351
博文 259
码字总数 81359
作品 0
成都
高级程序员
Rust用组合实现java中的继承重写

先来看看Java的继承和重写是怎么做的吧! Java继承的示例 输出: 抛开面向对象的思想,从语法的角度来分析,可以看到:我们通过继承在Student这个类型上调用到了Person这个类型中的方法。从而...

曾赛
2015/08/22
0
4
Qt之美(三)隐式数据共享

为了最大化资源使用,和最小化数据拷贝,Qt在很多类中用到了隐式数据共享,以便数据仅在被写入时才被拷贝。该机制也被称为flyweight模式。 让我们以QByteArray为例,看看其是如何实现的。其内...

晨曦之光
2012/04/13
900
0
10亿随机数取最小的10个

群里有人出题目了, 10亿个随机数里取最小的10个,我想当然的这样写: auto arr = new int[1000000000]; arr.sort() 然后取前面10个,结果运行的时候直接爆out of memory了。我还以为10亿个i...

通吃岛-低手哥
2015/09/28
422
7
Spring Auto-Wiring Beans

In Spring framework, you can wire beans automatically with auto-wiring feature. To enable it, just define the “autowire” attribute in <bean>. <bean id="customer" class="com.mk......

pczhangtl
2013/12/05
0
0
Cocos2d-x实例:设置背景音乐与音效-设置场景实现

设置场景(Setting),Setting.h文件代码如下: [html] view plaincopy #ifndef SettingSCENEH #define SettingSCENEH #include "cocos2d.h" #include "SimpleAudioEngine.h" class Setting ......

智捷课堂
2014/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue学习资料

一直以为Vue是依赖nodejs的。 作为前端也可以耦合性就很低了。 //npm包管理器 进行管理npm install vue//初始化一个项目vue init//本地调试npm run dev//编译完成 ...

大灰狼wow
30分钟前
1
0
fullcalendar重新渲染

uiCalendarConfig.calendars.lesson_calendar.fullCalendar('removeEvents');var ym = uiCalendarConfig.calendars.lesson_calendar.fullCalendar('getView').title;$scope.get_lesson(y......

人来疯啊
34分钟前
1
0
多渠道打包总结

https://www.jianshu.com/p/2130db7584c8 https://blog.csdn.net/u011153817/article/details/50772496...

塔塔米
43分钟前
1
0
android -------- Data Binding的使用 ( 六) 自定义属性

今天来说说DataBinding在自定义属性的使用 默认的android命名空间下,我们会发现并不是所有的属性都能直接通过data binding进行设置,比如margin,padding,还有自定义View的各种属性。 默认...

切切歆语
50分钟前
1
0
收邮件 下载附件

uses IdMessage, IdMessageParts, IdAttachment, IdGlobalProtocols, ...;procedure SaveAttachmentsFromFile(FileName: String)var IdMessage: TIdMessage; MsgPart: Ti......

vga
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部