Яка різниця між використанням та екстерном?


91

Я новачок у Русті. Я думаю, що useце використовується для імпорту ідентифікаторів у поточну область дії та externвикористовується для оголошення зовнішнього модуля. Але це розуміння (можливо, неправильне) для мене не має жодного сенсу. Хтось може пояснити, чому Руст має ці два поняття і які підходящі випадки для їх використання?


6
Ви маєте на увазі заяву extern crate foo;? Ящики та модулі - це окремі поняття в Rust, можливо, ви захочете поглянути на "Основну термінологію: ящики та модулі", яка пояснює різницю між ними (хоча я особисто вважаю приклади нижче занадто багатослівними).
Qantas 94 Heavy

Відповіді:


91

extern crate fooвказує, що ви хочете встановити зв'язок із зовнішньою бібліотекою, і вводить ім'я ящика верхнього рівня в область дії (еквівалент use foo). Як Руст в 2018 році, в більшості випадків вам не потрібно буде використовувати extern crateбільше , тому що Cargo інформує компілятор про те, що ящики присутні. (Є один або два винятки )

use bar це скорочення для посилання на повністю кваліфіковані символи.

Теоретично мова не потрібна use - ви завжди можете просто повністю визначити імена, але друкувати std::collections::HashMap.new(...)буде дуже нудно! Натомість ви можете просто ввести use std::collections::HashMapодин раз, а потім HashMapбуде посилатися на це.


3
Без цього useми навіть не могли б мати stdтакий фасад. Або у нас був би один монолітний стандартний ящик для бібліотеки, або всі мали б справу з тим, що Stringнасправді є collections::string::String.

52

Прийнята відповідь була правильною на момент написання статті. Однак це вже не правильно. extern crateмайже ніколи не потрібен, починаючи з Rust 2018.

Тепер вам потрібно лише додати зовнішні залежності до вашого Cargo.toml.

use працює так само, як і раніше.

Детальніше читайте в офіційній документації .

Редагувати: Прийняту відповідь відредаговано, щоб правильно відображати зміни в Rust 2018.


Навіть якщо це не потрібно, хіба не вигідно відокремити зовнішні ящики від стандартних? Як, extern crate failure;алеuse std::error::Error
Пол Разван Берг

2
@PaulRazvanBerg Ви маєте на увазі просто пояснити, який імпорт зі стандартної бібліотеки, а який зовнішній? Принаймні не для мене, і я не думаю, що це також рекомендується. Але я думаю, що вам слід структурувати свій код так, як ви вважаєте, найбільш зрозумілим для вас.
dropbear
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.