@Omefoxer

Почему трейт не может быть результатом метода внутри трейта?

Здравствуйте.
Проблема следующая: первый метод "chto-to" компилятор не пропускает, выдавая след. ошибку: `impl Trait` only allowed in function and inherent method return types, not in trait method return.
Но вот метод "lexing" результат работы которого почти то же самое нормально проходит.
Так вот, в чём разница между этими двумя методами, ведь в обоих случаях результат один, возврат должен реализовывать трейт StringAnalyzer?

pub trait StringAnalyzer {
    fn chto_to(&self) -> impl StringAnalyzer;
    fn lexing<T>(&self) -> T where T: StringAnalyzer;
}
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
В первом случае:
fn chto_to(&self) -> impl StringAnalyzer;
impl Trait значит, что функция возвращает неизвестную структуру, которая реализует трейт.
Возвращаемое значение определяется компилятором в момент объявления функции.
Внутри трейтов он это не может (хотя вроде хотят в будущем разрешить)

Во втором случае:
fn lexing<T>(&self) -> T where T: StringAnalyzer;
Тут возвращаемое значение определяется по месту вызова.

Если ты хочешь impl Trait использовать в трейтах - ты можешь использовать associated type:
pub trait NewTrait {
  type AssociatedType: ExistingTrait;
  fn function() -> Self::AssociatedType;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы