Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Namespaces 为什么可以';我不能在特质执行块的匹配臂中使用Self吗?_Namespaces_Rust - Fatal编程技术网

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"),
    }