Используя типы Vavr , я создал пару Some
s:
var input = Tuple(Some(1), Some(2));
Я хотел бы получить целые числа1
и 2
с использованием выражения совпадения Вавра;вот как я сейчас это делаю:
import static io.vavr.API.*;
import static io.vavr.Patterns.$Some;
import static io.vavr.Patterns.$Tuple2;
var output = Match(input).of(
Case($Tuple2($Some($()), $Some($())),
(fst, snd) -> fst.get() + "/" + snd.get()),
Case($(), "No match")
);
Это работает и возвращает "1/2"
, но меня беспокоит, так как я вызываю небезопасные get
методы для двух Some
s.
Я бы предпочел, чтобы выражение соответствия было разложено input
до точки, где оно извлекает самые внутренние целые числа.
Эта заметка в руководстве пользователя Vavr заставляет меня усомниться в том, что это возможно:
first Первый прототип Vavr Match API позволил извлечь пользовательский выбор объектов из шаблона совпадения.Без надлежащей поддержки компилятора это неосуществимо, потому что число сгенерированных методов увеличилось в геометрической прогрессии.Текущий API делает компромисс в том, что все шаблоны сопоставляются, но декомпозируются только корневые шаблоны.
И все же мне все еще интересно, есть ли более элегантный, безопасный для типов способ декомпозиции вложенного значения input
.