Как получить доступ к модулям из модулей родительских или родных папок? - PullRequest
2 голосов
/ 20 июня 2019

Я пытаюсь получить доступ к модулям из parser.rs и another.rs в solve.rs.Как включить эти модули и использовать «use операторов»?Если это невозможно, какой должна быть структура кода?

Вот дерево папок приложения:

app/src
--- main.rs
--- another.rs
--- mod.rs
--- parser/
-------- parser.rs
-------- mod.rs
--- solver/
-------- solve.rs
-------- mod.rs

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Чтобы получить доступ к parser/parser.rs и another.rs из любой точки вашей корзины, вы можете использовать абсолютные пути (здесь я также использую вложенные пути , что не требуется, но делает структуру модулей более понятной):

use crate::{
    parser::parser,
    another,
};

Вы также можете использовать относительные пути с super, который относится к родительскому модулю.Более подробная информация доступна в @ ответе Измаила .


Что касается структуры вашего кода, то кажется странным, почему у вас есть mod.rs (не неправильно, но просто странно, особенно 0; вы можете полностью покинуть 1 и 2, если хотите, но 0 может сбить вас с толку):

app/src
    main.rs
    another.rs
    mod.rs        // 0
    parser/
        parser.rs
        mod.rs    // 1
    solver/
        solve.rs
        mod.rs    // 2
  • Относительно 1и 2:

    mod.rs использовался в выпуске 2015 года для возможности создания вложенных модулей, но больше не требуется в выпуске 2018 года (при условии, что выиспользуется новейшая версия по умолчанию для грузового издания 2018 года, см. Что такое издания? ):

    Подкаталог foo.rs и foo/ могут сосуществовать;mod.rs больше не требуется при размещении подмодулей в подкаталоге.

  • Относительно 0:

    Модуль, которым вы являетесьопределение через это на самом деле называется mod (не src, как вы, возможно, ожидали, хотя я совсем не уверен, что вы ожидали здесь), я не уверен, что вы хотели это сделать.Однако, если вы это сделали, есть еще способ получить к нему доступ через r# - необработанные идентификаторы , доступные с Rust 1.30:

    use crate::r#mod;
    

    Если вы не хотите писать r#mod повсюду, вы можете использовать as следующим образом:

    use crate::r#mod as new_name;
    

    Затем вы можете обратиться к модулю через new_name.

1 голос
/ 20 июня 2019

Ваш первый вариант - абсолютные пути:

use crate::parser::Whatever;
use crate::solver::Another;

crate здесь - ключевое слово, представляющее корень ящика.

Вы также можете использовать относительные пути для сложных сценариев.Оба решения очень хорошо обсуждаются в соответствующей документации Rust

Также не забывайте, что вам нужно сделать модули общедоступными.По умолчанию они будут приватными и недоступными для родителей или братьев и сестер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...