6

dyn私はRust 1.27 で導入された特性で遊んでいて、このコンパイラ エラーに出くわしました:

error[E0433]: failed to resolve. Use of undeclared type or module `dyn`
 --> src\main.rs:1:30
  |
1 | fn _run0() -> Result<(), Box<dyn ::std::error::Error>> { Ok(()) }
  |                              ^^^ Use of undeclared type or module `dyn`

他のすべてのバリアントは正常にコンパイルされます。

fn _run0() -> Result<(), Box<dyn ::std::error::Error>> { Ok(()) } // Error

fn _run1() -> Result<(), Box<dyn std::error::Error>> { Ok(()) } // Ok

fn _run2() -> Result<(), Box<::std::error::Error>> { Ok(()) } // Ok

意図した動作ですか?


rustc 1.27.0 (3eda71b00 2018-06-19)

4

1 に答える 1

10

dynこれは、コンテキスト キーワードであるという事実の後方互換性の「落とし穴」です。dyn新しい構文が追加される前に、モジュール名として使用する次のコードを記述できます。

mod dyn {
    pub trait Error {}
}

fn example() -> Box<dyn ::Error> {
//                     ^ space doesn't matter
    unimplemented!()
}

これはコンパイルを停止できないため、パス コンポーネントとして解析する必要があります。

括弧を追加して明示的にすることができます。

fn example() -> Box<dyn (::dyn::Error)> { /* ... */ }

crate2018 年版では、パスの先頭で使用できます。

fn example() -> Box<dyn crate::dyn::Error> { /* ... */ }
于 2018-06-27T22:00:44.750 に答える