为什么在Rust中访问指向结构体的指针上的字段有效?

5
我注意到,当给定一个 `P` 时,在指针上直接访问 `SomeStruct` 的字段似乎可以工作,但我不确定为什么会这样。例如,以下代码编译并按预期工作(打印“1234”):
#![feature(rustc_private)]

extern crate syntax;
use syntax::ptr::P;

struct Baz {
    id: String,
}

fn foo() {
    let mut struct_pointer: P<Baz> = P(Baz {
        id: "1234".to_string(),
    });
    println!("{}", struct_pointer.id);
}

什么语言特性使我能够访问 struct_pointer 绑定上的 id 字段?是解引用(Dereferencing)还是强制类型转换(Coercion)?通过查看 P 的文档,是否有办法知道这种情况是否可行?

3
你的例子不完整且无法再现。请包含你对 PBaz 的定义。 - E net4
1
@E_net4 我之前并没有意识到 P 实际上是 Rust 编译器特有的,我还以为它是 Rust 中指针常用的东西(你可以看出我是个 Rust 新手)。我正在制作一个简单的编译器插件。 - Marcus Buffett
4
我很惊讶,你是从哪里听说的?这本书只是建议使用引用、Box 和引用计数指针(RcArc)。 - E net4
1
再次强调,这是针对syntax库的特定情况。我想不出在其他情境下使用它的理由。无论如何,@Procrade所说的可以被转化为一个实际的答案。 - E net4
2
@E_net4 是的,我知道这一点,之所以一开始有一个P是因为我从ExprKind中获取它。这个例子只是我正在处理的简化版本的意思。 - Marcus Buffett
显示剩余4条评论
1个回答

4

这是使用Deref特质 实现的。

在Rust中,.会在需要时自动解引用,因此编译器可以将foo.bar解释为(*foo).bar


1
除了 (*foo).bar 这种方式,还有没有其他明确的方法可以实现呢?比如 foo->bar - lucidbrot
1
@lucidbrot 故意地,没有其他的解引用语法。这是 Rust 想要隐藏的东西,不希望程序员进行微观管理。编译器和类型系统确保没有歧义。 - Kornel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接