fn main(){
let a = 1;
println!("{:p}",&a);
println!("{:p}",&&a);
println!("{:p}",&&a);
}
/*
0x7ffe58e66c0c
0x7ffe58e66ca0
0x7ffe58e66cf0
*/
&a
还能理解,打印的其实就是 a所在内存单元的地址
&&a
他是不是分配了一个临时的空间,来存放&a
,然后再去获得存放&a
的内存单元的地址
因为两次打印出来的是不一样的地址
如果有一个 b=&a
,打印&b
,好像更好理解一点
之所以想到这个问题,是因为在做 rustlings iterators5 的题目的时候
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
// map is a hashmap with String keys and Progress values.
// map = { "variables1": Complete, "from_str": None, ... }
//todo!();
// &Progress &&Progress
map.values().filter(|x| x == &&value).count()
}
这里的filter 里面的 closure函数,怎么去对比
values()
得到的是一个迭代器,每一个可迭代的item是一个 &'a V
类型
然后 filter
函数里面接受的
fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
Self: Sized,
P: FnMut(&Self::Item) -> bool,
这个P是的参数是&Self::Item
, 所以导致了我上面写的 |x|
中的x是 &&Progress
类型
但是 x==&&value
这样比,rustlings是通过了,可回到上面的 &&a
的例子,他每次又打印出不一样,我又有点疑惑
x==&&value
和 **x==value
哪个更好?
1
共 1 条评论, 1 页
评论区
写评论前一段在项目里脑抽没注意自己写了&&,找了半天为什么值没传过来(&&打印出的地址竟然高概率一样)……