Почему атрибут из extern prelude не применяется, когда его реэкспортируют в модуле?

  • 16 августа 2023 г. 22:16
Ответы на вопрос 2
Атрибут `extern prelude` указывает компилятору, что все импортированные функции, типы и прочие элементы из указанного модуля должны быть доступны без явного указания префикса. Однако, когда этот модуль реэкспортируется через публичный модуль, атрибут `extern prelude` не применяется.

В вашем примере, когда модуль `wasm_bindgen` импортируется как `wb`, он не содержит атрибут `extern prelude`. В результате, когда вы публично реэкспортируете функцию `logg`, компилятор не будет импортировать `wasm_bindgen` в пределах вашего модуля.

Чтобы избежать этой проблемы, можно явно указать полный путь при импорте `wasm_bindgen`, чтобы избежать неоднозначности. В вашем случае, вы можете использовать `::wasm_bindgen::prelude::wasm_bindgen` вместо `wb`:

```rust
use ::wasm_bindgen::prelude::wasm_bindgen as wb;

// ...

#[wb(start)]
pub fn js_main() {
    // ...
}
```

Теперь атрибут `extern prelude` будет применяться в рамках модуля `a`, и функция `logg` будет доступна без указания префикса `::wasm_bindgen::prelude::wasm_bindgen`.
1. Возможно, проблема не связана с языком программирования, а с библиотекой. Если компилятор сообщает об ошибке, то, скорее всего, атрибут видит тип с префиксом пути и, из-за этого, алгоритм парсинга ломается. Он считает часть описания типа, относящуюся к пути, частью самого типа, и не может сопоставить такой тип с указанными атомарными элементами.

2. Проблема возможно вызвана не языком программирования, а либой. Если компилятор выдает ошибку, то видимо атрибут видит тип с префиксом пути и алгоритм парсинга ошибается. Он рассматривает часть описания типа, которая принадлежит пути, как часть самого типа и не может сопоставить этот тип с указанными элементами.

3. Это кажется не связанным с языком, а с библиотекой. Если компилятор выдает ошибку, то, вероятно, атрибут видит тип с префиксом пути и ломается алгоритм парсинга. Он рассматривает путь до типа как часть самого типа и не может сопоставить его с указанными атомарными элементами.

4. Возможно, проблема связана не с языком программирования, а с библиотекой. Если компилятор выдает ошибку, то, вероятно, атрибут видит тип с префиксом пути, и из-за этого ломается алгоритм парсинга. Он считает часть описания типа, относящуюся к пути, частью самого типа, и не может сопоставить такой тип с указанными атомарными элементами.

5. Проблема, возможно, не в языке программирования, а в библиотеке. Если компилятор выводит ошибку, то, вероятно, атрибут видит тип с префиксом пути и алгоритм парсинга ломается. Он рассматривает часть описания типа, которая относится к пути, как часть самого типа, и не может сопоставить такой тип с указанными атомарными элементами.
Похожие вопросы