groovy Может ли нормальный троичный оператор преформовать более чем одну операцию? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть этот обычный троичный оператор, но мне нравится делать больше 1 операции, если false
, например:

def xxStr = x.x.1.1
    def ver = 0
    xxStr = (xxStr.contains('foo')) ? xxStr.replace('-foo','').tokenize('.') : xxStr.tokenize('.') && ver = xxStr.pop()

coruse, это не работает, так как xxStr.tokenize('.') && ver = xxStr.pop()
не ligal, но есть ли какой-нибудь элегантный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2020

Другой вариант - использовать with как в:

xxStr = xxStr.contains('foo') ? xxStr.replace('-foo','').tokenize('.') : xxStr.tokenize('.').with { pop() }
0 голосов
/ 10 февраля 2020

Тернарный оператор присваивает значение переменной, поэтому здесь нельзя вызвать выражение присваивания. Но есть и другие проблемы с кодом, который вы представили. Например:

xxStr.tokenize('.') && ver = xxStr.pop()

Ожидать, что xxStr после вызова xxStr.tokenize('.') является списком, является неправильным представлением. xxStr в этом выражении остается String, поэтому при вызове pop в нем будет выбрано MissingMethodException.

Если ваш код будет однострочным, это не означает, что вы используете элегантное решение. В этом случае я бы сказал, что все наоборот. Кроме того, вы используете def в динамическом контексте c (вы меняете тип с String на List). Это не запрещено, но в большинстве случаев это только вводит в заблуждение. Это делает ваш код сложнее для понимания и рассуждений.

Я бы настоятельно рекомендовал разделить код на два отдельных раздела: один отвечает за токенизацию строки в массив, а второй - за вывод версии. Это делает ваш код более понятным и простым для понимания. Если в Groovy было встроенное простое для чтения решение, вы могли бы рассмотреть возможность его использования. Но добавление этого ненужного уровня абстракции к такому простому варианту использования имеет очень мало смысла.

0 голосов
/ 10 февраля 2020

Вам потребуется блок кода, который может быть выполнен сразу.

Один вариант (очевидно) - это вызов функции, которая будет выполнять все операции:

def func() {
  println("no")
  println("definitely not")
}
(10 > 20) ? println ("yes") : func()

Другой вариант использует замыкание:

​(10 > 20) ? println("yes") :  {​​​​​​​println("no"); println ("definitely not")​​​​​​​​​​​​}.call()

Обе версии печатают:

no
definitely not
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...