一些简单的Rust code:
struct Point {
x: f64,
y: f64,
}
fn main() {
let p: &Point = &(Point { x: 0.3, y: 0.4 });
// println!("{:?}" , p->x); // no sugar here for Rust
println!("{:?}", (*p).x);
println!("{:?}", p.x); // sugar?
// no leak right? thanks Rust
}
类似的C code
#include <stdio.h>
#include <stdlib.h>
typedef struct Point Point;
struct Point {
float x;
float y;
};
int main() {
Point __tmp = { 0.3, 0.4 };
Point* p = &__tmp;
printf("%f\n", p->x); // C sugar for below
printf("%f\n", (*p).x);
// below doesn't work because p is a pointer to a point
//printf("%f", p.x); // error: request for member 'x' in something not a structure or union
// memory leak at this point right?
return 0;
}
在这两段代码中,p
似乎都是指向Point
的指针。
我想确保Rust实现p.x
是(或者可以被认为是)语法糖,并且我对正在发生的事情没有根本的误解。
这就是他们所说的“别名”吗?Rust中的p
更像是一个别名吗?
1条答案
按热度按时间whhtz7ly1#
p.x
在某种意义上确实是糖。Rust在进行方法/属性查找时,自动取消引用任何实现了traitDeref
或DerefMut
的类型(取决于上下文是否需要可变或不可变引用)。在您的示例中,引用
&Point
实现了Deref<Target=Point>
,因此您的p.x
表达式扩展为(*p).x
。请注意,只有当指针类型没有自己的名为x
的属性/方法时(简单引用不是这种情况),这才有效。有another question on SO继续关于自动取消引用的详细规则。