Почему я не могу импортировать `std :: assert` через` use`, пока он работает для других макросов из std? - PullRequest
4 голосов
/ 31 марта 2019

С Rust 2018 этот код работает ( Детская площадка ):

use std::panic;
use std::format;
use std::assert_eq;

Но это:

use std::assert;

Результатов этой ошибки:

error[E0432]: unresolved import `std::assert`
 --> src/lib.rs:4:5
  |
4 | use std::assert;
  |     ^^^^^^^^^^^ no `assert` in the root

Я прочитал руководство по изданию по этой теме и там говорится, что use должно работать с macro_rules! макросами и процедурными макросами. Таким образом, я запутался.

1 Ответ

5 голосов
/ 31 марта 2019

use должен работать с macro_rules! макросами и процедурными макросами

За исключением того, что assert не является ни тем, ни другим :

/// Built-in macros to the compiler itself.
///
/// These macros do not have any corresponding definition with a `macro_rules!`
/// macro, but are documented here. Their implementations can be found hardcoded
/// into libsyntax itself.

Это встроенный компилятор :

#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_doc_only_macro]
macro_rules! assert {
    ($cond:expr) => ({ /* compiler built-in */ });
    ($cond:expr,) => ({ /* compiler built-in */ });
    ($cond:expr, $($arg:tt)+) => ({ /* compiler built-in */ });
}

Другие макросы включают в себя:

  • compile_error
  • format_args
  • env
  • option_env
  • concat_idents
  • concat
  • line
  • column
  • file
  • stringify
  • include_str
  • include_bytes
  • module_path
  • cfg
  • include

Фактическое определение assert скрыто гораздо ниже в libsyntax_ext / assert.rs


Стабилизация равномерных путей на Rust 2018 (# 56417) упоминает об этом попутно:

Встроенные макросы, например use env. В настоящее время ошибка из-за некоторых (исправляемых) деталей реализации встроенных макросов. Нет известных проблем, которые нужно решить до стабилизации (после устранения ошибки).

...