Я начал изучать Rust (и Warp) всего несколько дней назад. У меня в голове не укладывается следующее:
Учитывая следующие конечные точки
let hi = warp::path("hi");
let bye = warp::path("bye");
let howdy = warp::path("howdy");
Почему следующее нормально
let routes = hi.or(bye).or(howdy);
Но не следующее:
let mut routes = hi.or(bye);
routes = routes.or(howdy);
Что выдает ошибку компиляции:
error[E0308]: mismatched types
--> src/lib.rs:64:14
|
63 | let mut routes = hi.or(bye);
| -------------------- expected due to this value
64 | routes = routes.or(howdy);
| ^^^^^^^^^^^^^^^^ expected struct `warp::filter::and_then::AndThen`, found struct `warp::filter::or::Or`
or()
заворачивается в новый тип. Вы можете использовать затенение:
let routes = hi.or(bye);
let routes = routes.or(howdy);
Если вам действительно нужно, чтобы они имели один и тот же тип (например, для использования в цикле), вы можете использовать метод boxed()
для создания типаж-объекта:
let mut routes = hi.or(bye).unify().boxed();
routes = routes.or(howdy).unify().boxed();
Можно ли его «переопределить» в другой области? Как сделать if ..{let routes = routes.or(howdy)}
Нет. Если у вас есть и if
, и else
, и оба возвращают один и тот же тип, вы можете сделать let routes = if ... { ... } else { ... };
О, облом. Я надеялся переопределить routes
несколько раз в цикле (добавить все разные конечные точки)
@JAnton Довольно проблема. Вы даже не можете использовать трейт-объекты, потому что Filter
не является объектно-безопасным. Может макрос поможет? Зачем нужна петля?
Я пишу деформирующую библиотеку для использования в Node, чтобы в основном заменить Express точным внешним скелетом. Таким образом, библиотека сначала сохраняет Vec
со всеми конечными точками, а затем добавляет их в routes
, когда приходит время listen
@JAnton Отредактировано.
error: expected opaque type, found enum warp::genric::Either
это брошено routes.or(howdy).boxed()
спасибо за вашу помощь, очень признателен
@JAnton Моя ошибка. Вы должны использовать .unify()
. Отредактировал ответ.
Оно работает! Первый раз слышу о "слежке". Вечером надо будет дочитать. Спасибо!