【问题标题】:Why can't I use Self in match arms in trait impl block? [duplicate]为什么我不能在 trait impl 块的匹配臂中使用 Self? [复制]
【发布时间】:2018-08-11 10:09:42
【问题描述】:

我可以写这个没问题:

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);
}

它编译得很好。令人惊讶的是,使用Self 注释掉的版本没有:

错误[E0599]:在当前范围内找不到类型 sufficiently_long_namespace::Foo 的名为 Bar 的变体

这是rustc 1.30.0-nightly (73c78734b 2018-08-05)

是我搞砸了我的命名空间,还是确实是一个错误?

最后,我确实想要明确的名称 impl Display for sufficiently_long_namespace::Foo,但必须在 match arm 中重复此操作似乎很笨拙。

【问题讨论】:

    标签: namespaces rust


    【解决方案1】:

    来自 IRC:

    (01:16PM) SpaceManiac:与其说是错误,不如说是缺少的功能
    (01:17PM) SpaceManiac:在比赛中考虑use long_ns::Foo;fmt() 的顶部,然后是Foo::Bar

    Rust 的 use 也是 permits renaming,所以我可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多