6

Rust で複数ファイルのクレートをコンパイルする方法を理解しようとしていますが、コンパイル エラーが発生し続けます。

私はクレートのthing.rsにインポートしたいファイルを持っています:

mod asdf {
    pub enum stuff {
        One,
        Two,
        Three
    }
}

そして私のクレートファイルtest.rc:

mod thing;

use thing::asdf::*;

fn main(){

} 

rust build test.rc を実行すると、次のようになります。

test.rc:3:0: 3:19 error: `use` and `extern mod` declarations must precede items
test.rc:3 use thing::asdf::*;
          ^~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

モジュール、クレート、および使用方法について、私が理解していない簡単なことが明らかにあります。私の理解では、何かを改造することでした。同じディレクトリまたは extern mod something 内のファイルの場合。ライブラリ パス上のライブラリに対して、オブジェクト ファイルがリンクされました。次に、を使用すると、モジュールの一部を現在のファイル、関数、またはモジュールにインポートできます。これは、コア ライブラリ内のものに対して機能するようです。

これは、バージョン 0.6 の錆コンパイラです。

4

1 に答える 1

9

useファイルの先頭にを配置するだけです。

use thing::asdf::*;

mod thing;

fn main() {}

これは非常に奇妙に見えますが、

  1. それはエラーメッセージが言うことです( sを含む、「アイテム」ではないuse、または「アイテム」であるトップレベルに置くことができるもの)、およびextern modmod
  2. これが Rust の名前解決のしくみです。useは常にクレートの上部に対して相対的であり、名前解決が行われる前にクレート全体がロードされるためuse thing::asdf::*;、rustcthingはクレートのサブモジュール (見つけたもの)asdfとして検索し、次にそのサブモジュールとして検索します。

この最後の点をよりよく説明するために (そして、 と の 2 つの特別な名前を示します。これらはuse、それぞれ親モジュールと現在のモジュールから直接インポートされます):superself

// crate.rs

pub mod foo {
    // use bar::baz; // (an error, there is no bar at the top level)

    use foo::bar::baz; // (fine)
    // use self::bar::baz; // (also fine)

    pub mod bar {
        use super::qux; // equivalent to
        // use foo::qux; 

        pub mod baz {}
    }
    pub mod qux {}
}

fn main() {}

(また、これとは別に、.rcファイル拡張子は Rust ツール (0.6 を含む) にとって特別な意味を持たなくなり、非推奨になりました。たとえば.rc、コンパイラ ソース ツリー内のすべてのファイルは最近 . に名前が変更されました.rs。)

于 2013-06-27T12:24:10.100 に答える