В C или C ++ вы можете написать:
return (fruit = getOrange()) ? fruit :
(fruit = getApple()) ? fruit :
(fruit = getMango()) ? fruit :
new Banana();
Причина, по которой следует избегать как этой, так и вашей первой версии, заключается не в «догмате о базовых структурах», а в том, что само по себе назначение в условии сбивает с толку. Не все языки поддерживают это, с одной стороны. С другой стороны, это просто неверно истолковано как ==
, или читатель может быть не уверен, действительно ли вы это имели в виду, или, возможно, намеревались ==
. Добавление != 0
к каждому условию становится довольно плотным и многословным.
GCC имеет расширение, позволяющее:
return getOrange() ? : getApple() ? : getMango() ? : new Banana();
Этого часто можно достичь с помощью ||
или or
(но не в C или C ++).
Другая возможность:
do {
fruit = getOrange();
if (fruit) break;
fruit = getApple();
if (fruit) break;
fruit = getMango();
if (fruit) break;
fruit = new Banana();
} while (false);
Это даже лучше в языке, где вы можете break
из базового блока, который вы можете использовать с last
в Perl, поскольку вы можете обойтись без do / while(false)
. Но, вероятно, это понравится только программистам на ассемблере.