Aynı projeden başka bir dosyadan bir modül nasıl eklenir?


131

Bu kılavuzu takip ederek bir Kargo projesi oluşturdum.

src/main.rs

fn main() {
    hello::print_hello();
}

mod hello {
    pub fn print_hello() {
        println!("Hello, world!");
    }
}

kullanarak çalıştırıyorum

cargo build && cargo run

ve hatasız derler. Şimdi ana modülü ikiye ayırmaya çalışıyorum ancak başka bir dosyadan bir modülü nasıl ekleyeceğimi çözemiyorum.

Proje ağacım buna benzer

├── src
    ├── hello.rs
    └── main.rs

ve dosyaların içeriği:

src/main.rs

use hello;

fn main() {
    hello::print_hello();
}

src/hello.rs

mod hello {
    pub fn print_hello() {
        println!("Hello, world!");
    }
}

İle bunu derlerken cargo buildalıyorum

error[E0432]: unresolved import `hello`
 --> src/main.rs:1:5
  |
1 | use hello;
  |     ^^^^^ no `hello` external crate

Derleyicinin önerilerini takip etmeye çalıştım ve şu şekilde değiştirdim main.rs:

#![feature(globs)]

extern crate hello;

use hello::*;

fn main() {
    hello::print_hello();
}

Ama bu hala pek yardımcı olmuyor, şimdi şunu anlıyorum:

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

Mevcut projeden bir modülün projenin ana dosyasına nasıl ekleneceğine dair önemsiz bir örnek var mı?



Yanıtlar:


239

Buna gerek yok mod hellosenin içinde hello.rsdosyanın. Sandık kökü dışındaki herhangi bir dosyadaki kod ( main.rsyürütülebilir dosyalar lib.rsiçin, kitaplıklar için) otomatik olarak bir modülde ad alanlıdır.

Kodu eklemek için hello.rssizin de main.rs, kullanım mod hello;. İçinde bulunan koda genişletilir hello.rs(tam olarak daha önce sahip olduğunuz gibi). Dosya yapınız aynı şekilde devam eder ve kodunuzun biraz değiştirilmesi gerekir:

main.rs:

mod hello;

fn main() {
    hello::print_hello();
}

hello.rs:

pub fn print_hello() {
    println!("Hello, world!");
}

1
Geç Soru, mod merhaba yerine merhaba kullanma ile belirtirsem de işe yaramaz mı ?!
Christian Schmitt

17
@ChristianSchmitt Hayır, farklı şeyler. dosyayı çekerken usesadece bir isim alanı modşeyidir. Sen kullanacağı usearama yapabilmek için, örneğin, print_helload ile önek gerek kalmadan işlevini
Renato Zannon

27

İç içe modüllere sahip olmak istiyorsanız ...

Rust 2018

Oluyor artık gerekli dosyayı olması mod.rs(hala desteklenmesine rağmen). Deyimsel alternatif, dosyaya modülün adını vermektir:

$ tree src
src
├── main.rs
├── my
│   ├── inaccessible.rs
│   └── nested.rs
└── my.rs

main.rs

mod my;

fn main() {
    my::function();
}

my.rs

pub mod nested; // if you need to include other modules

pub fn function() {
    println!("called `my::function()`");
}

Pas 2015

mod.rsKlasörünüzün içine modülünüzle aynı adı taşıyan bir dosya koymanız gerekir . Rust by Example bunu daha iyi açıklıyor.

$ tree src
src
├── main.rs
└── my
    ├── inaccessible.rs
    ├── mod.rs
    └── nested.rs

main.rs

mod my;

fn main() {
    my::function();
}

mod.rs

pub mod nested; // if you need to include other modules

pub fn function() {
    println!("called `my::function()`");
}

5
Ben bir şey kullanmak istedim varsayalım inaccessible.rsiçinde nested.rsbunu nasıl ...?
Heman Gandhi

Kardeş .rs dosyasına main.rs dışındaki bir dosyadan erişmek için, yol niteliğini kullanın. Bu yüzden, nested.rs'ın üst kısmına aşağıdakileri ekleyin: #[path = "inaccessible.rs"]ve sonraki satıra:mod inaccessible;
Gardener


2
Eklemek @HemanGandhi mod inaccessible;için my/mod.rsbunun alt modül yapmak için mygelen, daha sonra erişim kardeş modülü nested.rsgöreli yoluna göre super::inaccessible::function(). pathburada özniteliğe ihtiyacınız yok.
artin

10

Gardener'in cevabını gerçekten beğendim. Öneriyi modül bildirimlerim için kullanıyorum. Bununla ilgili teknik bir sorun varsa, lütfen birisi haber verin.

./src
├── main.rs
├── other_utils
│   └── other_thing.rs
└── utils
    └── thing.rs

main.rs

#[path = "utils/thing.rs"] mod thing;
#[path = "other_utils/other_thing.rs"] mod other_thing;

fn main() {
  thing::foo();
  other_thing::bar();
}

utils / thing.rs

pub fn foo() {
  println!("foo");
}

other_utils / other_thing.rs

#[path = "../utils/thing.rs"] mod thing;

pub fn bar() {
  println!("bar");
  thing::foo();
}

Bu 'numarayı' içinde fnbulunduğu dosya ile aynı isimde yeniden ihraç etmek için kullanmak zorundaydı.#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;
Arek Bal

1
bu kabul edilen cevap olmalıdır imo
Homam Bahrani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.