2016-04-03 2 views
15

Говоря об импорте, слово prelude используется так часто у рустеков.Что такое прелюдия?

Что это такое прелюдия О них говорят?

Как это влияет на мои программы Rust?

ответ

13

В Русте, для того, чтобы использовать символ, вы должны либо:

  • определил символ в текущей области
  • импортирован символ в текущей области через use директивы: use std::mem;
  • иметь в виду символ, используя его абсолютный путь: std::mem::replace

однако, некоторые очень немногие символы могут быть использованы без таких действий: Option или Copy например!

Это связано с Rust prelude.

Было признано, что ряд признаков, типов и функций был так часто использован, что имеет смысл не требовать, чтобы их использование требовало явного импорта необходимых символов каждый раз. Это достигается благодаря двух неявным действиям, предпринятых компилятор:

  • в корне каждого ящика, компилятор вставляет неявный extern crate std;
  • в каждом модуле, компилятор вставляет неявный use std::prelude::v1::*; (пока)

std::prelude::v1 является просто регулярным модулем, который реэкспортирует часто используемые символы с использованием синтаксиса pub use .... Его точное содержание можно найти here.


ряд других библиотек, или даже подкомпонентов стандартной библиотеки также определить prelude модуль, который вы можете импортировать с тем же синтаксисом Глоб импорта: use xxx::prelude::*;. В отличие от std::prelude, однако они не имеют специальной оболочки компилятором и поэтому требуют явного импорта.


компилятор агностик к точному содержанию прелюдии, поэтому если один должен был заменить std ящик со своими собственными (например, во вложенном развития), то можно было бы решить, что входит в их std::prelude::v1 модуль.

+0

@ LukasKalbertodt: Хорошо, я начал писать ответ с помощью 'vec!', 'Panic!', ... но не смог найти, откуда они пришли. Я удалю его. –

+0

[Этот RFC] (https://github.com/rust-lang/rfcs/pull/890) предлагает добавить функциональность прелюдии к ящикам пользователя. Некоторое время назад оно было закрыто, но может быть возрождено в будущем. –

+0

@ MatthieuM. Спасибо за четкое объяснение. Кажется, что макрос 'println!' Не исходит из 'std :: prelude'? –

Смежные вопросы