Namespaces 为什么可以';我不能在特质执行块的匹配臂中使用Self吗?
我可以写这篇文章,没问题:Namespaces 为什么可以';我不能在特质执行块的匹配臂中使用Self吗?,namespaces,rust,Namespaces,Rust,我可以写这篇文章,没问题: mod sufficiently_long_namespace { pub enum Foo { Bar, Buzz, Quux, } } use std::fmt::{Display, Error, Formatter}; impl Display for sufficiently_long_namespace::Foo { fn fmt(&self, f: &mut For
mod sufficiently_long_namespace {
pub enum Foo {
Bar,
Buzz,
Quux,
}
}
use std::fmt::{Display, Error, Formatter};
impl Display for sufficiently_long_namespace::Foo {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
match self {
//-- NOTE: this works
sufficiently_long_namespace::Foo::Bar => write!(f, "it's Foo stuff"),
sufficiently_long_namespace::Foo::Buzz => write!(f, "it's Buzz stuff"),
sufficiently_long_namespace::Foo::Quux => write!(f, "it's Quux stuff"),
//-- but this doesn't:
// Self::Bar => write!(f, "it's Foo stuff"),
// Self::Buzz => write!(f, "it's Buzz stuff"),
// Self::Quux => write!(f, "it's Quux stuff"),
}
}
}
fn main() {
let test1 = sufficiently_long_namespace::Foo::Bar;
println!("{}", test1);
}
mod\u长\u名称空间{
酒馆{
酒吧,
嗡嗡声
库克斯,
}
}
使用std::fmt::{Display,Error,Formatter};
足够长的名称空间的impl显示::Foo{
fn fmt(&self,f:&mut格式化程序)->结果{
匹配自我{
//--注意:这是有效的
足够长的名称空间::Foo::Bar=>write!(f,“这是Foo的东西”),
足够长的名称空间::Foo::Buzz=>write!(f,“这是Buzz的东西”),
足够长的名称空间::Foo::qux=>write!(f,“这是qux的东西”),
//--但这并不是:
//Self::Bar=>write!(f,“这是Foo的东西”),
//Self::Buzz=>write!(f,“这是Buzz的东西”),
//Self::qux=>write!(f,“这是qux的东西”),
}
}
}
fn main(){
让test1=足够长的名称空间::Foo::Bar;
println!(“{}”,test1);
}
它编译得很好。令人惊讶的是,使用Self
注释掉的版本没有:
错误[E0599]:在当前范围内找不到类型足够长的名称空间::Foo
的名为Bar
的变量
这是rustc 1.30.0-nightly(73c78734b 2018-08-05)上的
我是把我的名字空间搞砸了,还是真的是个bug
最后,我确实希望在中使用显式名称
impl显示足够长的名称空间::Foo
,但必须在match
arms中重复此操作似乎很笨拙。来自IRC:
(下午1:16)太空狂人:与其说是一个bug,不如说是一个缺失的特性
(01:17PM)太空人:考虑<代码>使用龙::FoO;<代码>在匹配中的fmt()
顶部,然后Foo::Bar
Rust的也可以使用
,因此我可以这样做:
use sufficiently_long_namespace::Foo as _Self;
match self {
_Self::Bar => write!(f, "it's Foo stuff"),
_Self::Buzz => write!(f, "it's Buzz stuff"),
_Self::Quux => write!(f, "it's Quux stuff"),
}
尽管这样更好:
use sufficiently_long_namespace::Foo;
match self {
Bar => write!(f, "it's Foo stuff"),
Buzz => write!(f, "it's Buzz stuff"),
Quux => write!(f, "it's Quux stuff"),
}