web-dev-qa-db-ja.com

Rust 2015?

あるファイル(モジュール)から別のファイルに関数を含める(またはインポート、挿入、またはその他のWordする)方法が見つかりません。

新しいプロジェクトを開始します

$ cd ~/projects
$ cargo new proj --bin
$ cd proj
$ tree
.
|
-- Cargo.toml
-- src
   |
   -- main.rs

main.rsを変更し、次のコードで新しいファイルa.rssrc dir内)を作成します。

main.rs

fn main() {
    println!("{}", a::foo());
}

a.rs

pub fn foo() -> i32 { 42 }

cargo runでプロジェクトを実行すると、エラーが発生します。

error[E0433]: failed to resolve: use of undeclared type or module `a`
 --> src/main.rs:2:20
  |
2 |     println!("{}", a::foo());
  |                    ^ use of undeclared type or module `a`

どういうわけかaをインポートする必要があるようです。 main.rsの最初の行として次のものを追加しようとしました

  • use a;

    error[E0432]: unresolved import `a`
     --> src/main.rs:1:5
      |
    1 | use a;
      |     ^ no `a` in the root
    
  • use a::*;

    error[E0432]: unresolved import `a`
     --> src/main.rs:1:5
      |
    1 | use a::*;
      |     ^ maybe a missing `extern crate a;`?
    
    error[E0433]: failed to resolve: use of undeclared type or module `a`
     --> src/main.rs:4:20
      |
    4 |     println!("{}", a::foo());
      |                    ^ use of undeclared type or module `a`
    
  • use a::foo;

    error[E0432]: unresolved import `a`
     --> src/main.rs:1:5
      |
    1 | use a::foo;
      |     ^ maybe a missing `extern crate a;`?
    
    error[E0433]: failed to resolve: use of undeclared type or module `a`
     --> src/main.rs:4:20
      |
    4 |     println!("{}", a::foo());
      |                    ^ use of undeclared type or module `a`
    
  • extern crate a; use a::foo;

    error[E0463]: can't find crate for `a`
     --> src/main.rs:1:1
      |
    1 | extern crate a;
      | ^^^^^^^^^^^^^^^ can't find crate
    
  • extern crate proj; use proj::a::foo;

    error[E0463]: can't find crate for `proj`
     --> src/main.rs:1:1
      |
    1 | extern crate proj;
      | ^^^^^^^^^^^^^^^^^^ can't find crate
    

ガイド を読みましたが、それでもインポートの方法がわかりません。

41
vil

メインのモジュール(main.rs、lib.rs、またはsubdir/mod.rs)では、mod a;プロジェクト全体(またはサブディレクトリ)で使用する他のすべてのモジュール。

他のモジュールでは、use a;またはuse a::foo;

これで混乱するのはあなただけではありませんし、もっと良くすることは確かに可能ですが、モジュールシステムへの変更はすべて「混乱を招く」として拒否されます。

編集:この回答は、「Rust 2015」言語標準向けに作成されました。 「Rust 2018」標準に変更が加えられました。 このブログ投稿 および エディションガイド を参照してください

38
o11c