Syntax 当表达式被包装在块中时,为什么这种deref强制会失败?
Syntax 当表达式被包装在块中时,为什么这种deref强制会失败?,syntax,rust,coercion,Syntax,Rust,Coercion,String实现Deref,这意味着编译以下代码: fn save(who: &str) { println!("I'll save you, {}!", who); } save(&String::from("Madoka")); reset(&{ Homura }); 如果我创建的自定义类型也实现了Deref,那么它也可以: struct Madoka; impl Deref for Madoka { type Target = str;
String
实现Deref
,这意味着编译以下代码:
fn save(who: &str) {
println!("I'll save you, {}!", who);
}
save(&String::from("Madoka"));
reset(&{ Homura });
如果我创建的自定义类型也实现了Deref
,那么它也可以:
struct Madoka;
impl Deref for Madoka {
type Target = str;
fn deref(&self) -> &Self::Target {
"Madoka"
}
}
save(&Madoka);
现在,让我们尝试强制另一种类型——比如,u32
。这似乎也很有效:
fn reset(how: &u32) {
println!("Reset {} times", how);
}
struct Homura;
impl Deref for Homura {
type Target = u32;
fn deref(&self) -> &Self::Target {
&42
}
}
reset(&Homura);
但当我将表达式包装在块中时,它不再编译:
fn save(who: &str) {
println!("I'll save you, {}!", who);
}
save(&String::from("Madoka"));
reset(&{ Homura });
错误[E0308]:类型不匹配
-->src/main.rs:17:14
|
17 |重置(&{Homura});
|^^^^应为u32,找到结构`main::Homura`
|
=注意:应为'u32'类型`
找到类型`main::Homura`
奇怪的是,与&str
等价的表达式编译得很好:
save(&{ Madoka }); // OK
为什么第一个表达式编译失败,而第二个表达式编译成功
我不知道为什么会这样,但您可以使用两个符号使其工作:
reset(&&&{Homura})代码>或将符号放在块内:重置({&Homura})代码>通常在这些情况下,我会说这是一个bug,然后@trentcl会解释它实际的预期行为。考虑到这一点。。。我觉得它看起来像个虫子。切片似乎有点特别。如果&Deref::Target
是一个切片,那么它就可以工作了。@PeterHall很抱歉让你失望,因为我认为这一定是个bug。;-)我已经提交了一份关于。