- эта работа?
$rules = [
'price' => 'nullable|regex:/^(\d+(,\d{1,2})?)?$/'
];
Да, это сокращенная форма
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
Она называется условным оператором. Многие люди (ошибочно) называют это тернарным оператором , потому что это единственный тернарный (три аргумент) оператор в Java, C, C ++ и, возможно, многих других языках. Но теоретически там мог бы быть другим тернарным оператором, тогда как может быть только один условный оператор .
Официальное название дано в Java Спецификация языка :
§15.25 Условный оператор? :
Условный оператор
blockquote>? :
использует логическое значение одного выражения для определения того, какое из двух других выражений должно быть оценено.Обратите внимание, что обе ветви должны приводить к методы с возвращаемыми значениями:
Это ошибка времени компиляции для второго или третьего выражения операнда как вызов метода void.
Фактически, по грамматике выражений выражения ( §14.8 ) не допускается, чтобы условное выражение появлялось в любом контексте, где мог появиться вызов метода void.
blockquote>Итак, если
doSomething()
иdoSomethingElse()
являются недействительными методами, вы не можете сжать это:if (someBool) doSomething(); else doSomethingElse();
в это:
someBool ? doSomething() : doSomethingElse();
Простые слова:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
Мне действительно нравится этот оператор, но читатель должен быть принят во внимание.
Вы всегда должны балансировать компактность компакт-диска с затраченным временем на чтение и тем самым иметь довольно серьезные недостатки .
Прежде всего, есть случай Оригинального Аскера. Он просто потратил час, разместив об этом и прочитав ответы. Как долго он должен был писать автору каждый?: Как if, то на протяжении всей его жизни. Не час, чтобы быть уверенным.
Во-вторых, на языках C-типа у вас появляется привычка просто знать, что условные обозначения - это первое, что есть в строке. Я заметил это, когда я использовал Ruby и натолкнулся на строки вроде:
callMethodWhatever(Long + Expression + with + syntax) if conditional
Если бы я был долгое время пользователем Ruby, у меня, вероятно, не было бы проблем с этой строкой, а из C, когда вы видите «callMethodWhatever» в качестве первой вещи в строке, вы ожидаете, что она будет выполнена. «?» Менее загадочный, но все еще достаточно необычный, чтобы отбросить читателя.
Преимущество, однако, - это действительно крутое чувство в вашем животике, когда вы можете написать 3-строчный оператор if в пространство 1 строки. Не могу отрицать этого :) Но, честно говоря, не обязательно более читаемый 90% людей там просто из-за своей «редкости».
Когда это действительно назначение на основе логического значения, и значения у меня нет с ним, но его можно легко злоупотреблять.
Тернарный, условный; помидор, помидор. Для этого важна переменная инициализация. Если (как и я) вы любите инициализировать переменные, где они определены, условный тернарный оператор (для этого и тот и другой) позволяет вам сделать это в тех случаях, когда существует условность относительно его значения. Особенно примечателен в конечных полях, но полезен и в других местах.
например:
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
Без этого оператора - по какому-либо имени - вам нужно будет сделать поле не -финал или написать функцию просто для ее инициализации. На самом деле, это неправильно - ее можно инициализировать, используя if / else, по крайней мере, на Java. Но я нахожу этого чище.
Правильно. Он называется термальным оператором . Некоторые также называют это условным оператором .
Его тернарный оператор (?:)
The ternary operator is an operator that takes three arguments. The first
argument is a comparison argument, the second is the result upon a true
comparison, and the third is the result upon a false comparison.
Да, вы правы. ?: обычно называется «тернарным условным оператором», который часто называют просто «тройным оператором». Это сокращенная версия стандарта if / else условная.
condition ? truth : false;
Если условие равно true
, верните первый параметр. Если условие равно false
, верните второй параметр.
Он называется Условным оператором и является типом Тройной операции .
Другие ответили на это в разумной степени, но часто с именем «тернарный оператор».
Будучи педантом, которым я являюсь, я хотел бы четко указать, что имя оператора условный оператор или «условный оператор?:». Это a тернарный оператор (в том, что он имеет три операнда), и в настоящий момент он является единственным тернарным оператором в Java.
Однако спецификация довольно ясно , что его имя является условным оператором или «условным оператором?:», чтобы быть абсолютно однозначным. Я думаю, что более понятно назвать это именем, поскольку оно указывает на поведение оператора в некоторой степени (оценивая условие), а не только на количество его операндов.
Согласно Sun Java Specification , он называется Условным оператором. См. Раздел 15.25. Вы правы в том, что он делает.
Условный оператор? : использует логическое значение одного выражения для определения того, какое из двух других выражений должно быть оценено.
Условный оператор синтаксически право-ассоциативный (он группируется справа налево), так что a? b: c? d: e? f: g означает то же, что и b: (c? d: (e? f: g)).
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
Условный оператор имеет три выражения операнда; ? появляется между первым и вторым выражениями и появляется между вторым и третьим выражениями.
Первое выражение должно иметь тип boolean или Boolean, или возникает ошибка времени компиляции.
Это условный оператор, и это не просто кратчайший способ написания операторов if.
Поскольку это выражение, которое возвращает значение, оно может использоваться как часть других выражений.
Эта конструкция называется Тернарным оператором в области компьютерных наук и программирования. И Wikipedia предлагают следующее объяснение:
В информатике троичный оператор (иногда неправильно называемый третичным оператором) является оператором, который принимает три аргумента. Аргументы и результат могут быть разных типов. Многие языки программирования, использующие синтаксис C-типа, имеют тройной оператор,? :, который определяет условное выражение.
blockquote>Не только в Java этот синтаксис доступен в PHP, Objective-C тоже .
В следующей ссылке он дает следующее объяснение, которое очень приятно понять:
Тернарный оператор - это некоторая операция, выполняющая на 3 входах. Это ярлык для оператора if-else и также известен как условный оператор.
В Perl / PHP он работает как:
boolean_condition ? true_value : false_value
В C / C ++ он работает как:
blockquote>logical expression ? action for true : action for false
Это может быть читаемо для некоторых логических условий, которые не слишком сложны, в противном случае лучше использовать блок If-Else с предполагаемой комбинацией условной логики.
Мы можем упростить блоки If-Else с помощью этого оператора Ternary для одной строки оператора кода. Например:
if ( car.isStarted() ) { car.goForward(); } else { car.startTheEngine(); }
Возможно, это будет следующее:
( car.isStarted() ) ? car.goForward() : car.startTheEngine();
Итак, если мы ссылаемся на ваше утверждение:
int count = isHere ? getHereCount(index) : getAwayCount(index);
Это фактически 100% эквивалент следующего блока If-Else:
int count; if (isHere) { count = getHereCount(index); } else { count = getAwayCount(index); }
Вот и все! Надеюсь, это помогло кому-то! Ура!
Неправильно, если быть точным:
То, что «вернулось», очень важно. Это означает, что методы должны возвращать значение, и это значение должно быть назначено где-то.
Кроме того, это не совсем синтаксически эквивалентно версии if-else. Например:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
Если кодировка с if-else всегда приведет к большему байт-коду.