Может ли выражение переключения Java 21 иметь несколько охранников?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Может ли выражение переключения Java 21 иметь несколько охранников?

Сообщение Anonymous »

У меня есть следующий тип лексера аргумента командной строки (на основе lexopt)

Код: Выделить всё

private sealed interface Opt permits ShortOpt, LongOpt, MiscOpt {}
record ShortOpt(char opt) implements Opt {}  // the "a", "b", or "c" in "-abc"
record LongOpt(String opt) implements Opt {} // the "option" in "--option"
record MiscOpt(String etc) implements Opt {} // something argument with no hyphens
Я хотел бы выполнить сопоставление с образцом, но для обработки короткого и длинного варианта мне нужно иметь две копии каждого выражения case.

Код: Выделить всё

switch(opt) {
case ShortOpt(char c) when c == 'h' ->
printHelp();
case LongOpt(String s) when s.equals("help") ->
printHelp();

case ShortOpt(char c) when c == 'V' ->
printVersion();
case LongOpt(String s) when s.equals("version") ->
printVersion();

default ->
System.out.println("Unrecognized option: " + opt);
}
Когда я использую выражение переключения Java 21 для перечисления или целого числа, я могу объединить несколько регистров с помощью запятой. Но, похоже, это не работает, когда задействован охранник:

Код: Выделить всё

switch(opt) {
//                                 👇 syntax error
case ShortOpt(char c) when c == 'h', LongOpt(String s) when s.equals("help") ->
printHelp();
case ShortOpt(char c) when c == 'V', LongOpt(String s) when s.equals("version") ->
printVersion();
default ->
System.out.println("Unrecognized option: " + opt);
}
Есть ли какая-то синтаксическая форма, которую мне не хватает? Или это просто невозможно?
Пробовал запятую, трубу (как в Rust), двойную трубу. Посмотрел JEP, но там, похоже, ничего не говорится о блоках с несколькими регистрами

Подробнее здесь: https://stackoverflow.com/questions/785 ... ple-guards
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»