文档章节

auto deref or auto ref ?

曾赛
 曾赛
发布于 2015/02/06 15:06
字数 369
阅读 92
收藏 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步,直到找到或失败。



© 著作权归作者所有

共有 人打赏支持
曾赛

曾赛

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

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

曾赛
2015/08/22
0
4
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
C# 读取IE缓存文件

http://topic.csdn.net/u/20091102/13/a35034b7-cc18-4aa7-90e3-941604152bb3.html 背景:大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时...

zting科技
2017/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
21分钟前
3
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
37分钟前
3
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
55分钟前
2
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
今天
6
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部