Pointers 为什么访问指向结构的指针上的字段会导致生锈?

Pointers 为什么访问指向结构的指针上的字段会导致生锈?,pointers,rust,coercion,Pointers,Rust,Coercion,我注意到,给定一个p,直接在指针上访问SomeStruct的字段似乎是可行的,我不确定这是为什么。例如,此代码按预期编译和工作(打印“1234”): #![功能(rustc_private)] 外部板条箱语法; 使用语法::ptr::P; 结构Baz{ id:String, } fn foo(){ 设mut struct_指针:P=P(Baz{ id:“1234”。to_string(), }); println!(“{}”,结构指针.id); } 什么语言功能允许我访问struct\u指针上

我注意到,给定一个
p
,直接在指针上访问
SomeStruct
的字段似乎是可行的,我不确定这是为什么。例如,此代码按预期编译和工作(打印“1234”):

#![功能(rustc_private)]
外部板条箱语法;
使用语法::ptr::P;
结构Baz{
id:String,
}
fn foo(){
设mut struct_指针:P=P(Baz{
id:“1234”。to_string(),
});
println!(“{}”,结构指针.id);
}
什么语言功能允许我访问
struct\u指针上的
id
字段?取消引用?胁迫?有没有办法通过查看
P
的文档来判断这种方法是否有效?

它正在使用


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

您的示例不完整且不可复制。请包括您对
P
Baz
的定义。我认为
P
语法::ptr::P
,而
Baz
是随机结构?鉴于
P
Deref
实现,它必须是去引用强制。事实上,
“1234”也是如此。对于_string
@E_net4,我没有意识到
P
是特定于rust编译器的,事实上,我认为这是rust中常用的指针(你可以看出我有点像rust noob)。我正在制作一个简单的编译器插件。我真的很惊讶。你从哪里听说的?这本书应该只建议使用引用、
Box
和引用计数指针(
Rc
Arc
)。@E_net4是的,我知道,我之所以有一个P,首先是因为我是从ExprKind得到的。这个例子只是我正在使用的东西的简化版本。除了
(*foo).bar
(例如,
foo->bar
?@lucidbrot故意没有其他用于取消引用的语法。这是Rust想要隐藏的东西,不希望程序员进行微观管理。编译器和类型系统确保没有歧义。
#![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);
}