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.