Баг нашёл и исправил, но причину не понял.
Я сделал следующее. Я сделал приватный фасад-модуль, в который я реэкспортировал разные штуки из std в случае если включена фича "std", и реэкспортировал те же самые вещи, но из core, если фича std не включена. Затем провел рефакторинг кода, заменив повсеместно исользование стандарнтных вещей на реэкспорт из фасад-модуля.
Баг возникает в следущем случае. Есть некий итератор(Iterator). Использование, условно, выглядит так:
use crate::facade::{Some, Iterator}
match my_iterator.next() {
None => {...} // Всегда попадаю сюда, даже если итератор не пуст.
Some(foo) => {...}
}
Этот код компилируется, но я всегда попадаю в ветку "None". При этом None не импортирован из crate::facade, и у меня включена глобальная опция #![no_implicit_prelude] в библиотеке.
Если None импортировать, то всё работает правильно.
Собственно, я не понимаю двух вещей:
1. Почему оно вообще компилировалось?
2. Почему процесс исполнения попадал в ветку None?
К чему вообще резолвится None в такой конфигурации?
None юзается не как Option::None, а как идентификатор
Обсуждают сегодня