Почему я не могу использовать многострочный шаблон построителя

Я начал изучать 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` 
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
0
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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();

Оно работает! Первый раз слышу о "слежке". Вечером надо будет дочитать. Спасибо!

JAnton 21.03.2022 18:11
Затенение переменных — Википедия. По сути, это переопределение переменной с тем же именем и (возможно) другим типом и значением (в отличие от присваивания, которое изменяет исходную переменную и не может изменить тип).
Chayim Friedman 21.03.2022 18:12

Можно ли его «переопределить» в другой области? Как сделать if ..{let routes = routes.or(howdy)}

JAnton 21.03.2022 18:17

Нет. Если у вас есть и if, и else, и оба возвращают один и тот же тип, вы можете сделать let routes = if ... { ... } else { ... };

Chayim Friedman 21.03.2022 18:18

О, облом. Я надеялся переопределить routes несколько раз в цикле (добавить все разные конечные точки)

JAnton 21.03.2022 18:19

@JAnton Довольно проблема. Вы даже не можете использовать трейт-объекты, потому что Filter не является объектно-безопасным. Может макрос поможет? Зачем нужна петля?

Chayim Friedman 21.03.2022 18:21

Я пишу деформирующую библиотеку для использования в Node, чтобы в основном заменить Express точным внешним скелетом. Таким образом, библиотека сначала сохраняет Vec со всеми конечными точками, а затем добавляет их в routes, когда приходит время listen

JAnton 21.03.2022 18:23

@JAnton Отредактировано.

Chayim Friedman 21.03.2022 18:28
error: expected opaque type, found enum warp::genric::Either это брошено routes.or(howdy).boxed() спасибо за вашу помощь, очень признателен
JAnton 21.03.2022 18:38

@JAnton Моя ошибка. Вы должны использовать .unify(). Отредактировал ответ.

Chayim Friedman 21.03.2022 21:31

Другие вопросы по теме