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。;-)我已经提交了一份关于。