Такой оператор не является частью текущей версии Delphi, потому что он не был частью предыдущей версии, и спрос был недостаточно велик, чтобы оправдать стоимость его добавления. (Вы найдете, что это объяснение применимо к лотам функций, которые вы хотели бы иметь в лотах продуктов.)
Delphi предоставляет набор IfThen
функций в блоках Math и StrUtils, но у них есть прискорбное свойство оценивать оба параметра-значения, поэтому код, подобный этому, завершится ошибкой:
Foo := IfThen(Obj = nil, '<none>', Obj.Name);
Чтобы действительно сделать это правильно, нужна помощь от компилятора. В сообществе Delphi я чувствую общую неприязнь к синтаксису в стиле C, используя знак вопроса и двоеточие. Я видел предложения, которые будут использовать синтаксис, подобный этому:
Foo := if Obj = nil then
'<none>'
else
Obj.Name;
Часть того, что делает условные операторы такими привлекательными, состоит в том, что они позволяют вам писать краткий код, но стиль написания всего в Delphi делает вышеперечисленное непривлекательным, даже если поместить все в одну строку.
Это не обязательно должен быть оператор . Delphi Prism предоставляет магическую функцию компилятора Iif
, которая оценивает только один из двух своих параметров:
Foo := Iif(Obj = nil, '<none>', Obj.Name);
Вы спросили, почему такая функция не была бы добавлена вместе со всеми другими языковыми функциями, добавленными в Delphi 2009. Я думаю, это ваша причина. Произошло множество других языковых изменений, которые уже требовали деликатной обработки; разработчики не должны были быть обременены еще большим. Возможности не бесплатны.
Вы спросили, будет ли когда-нибудь в Delphi такая функция. Я не причастен к совещаниям по планированию Embarcadero, и мне пришлось отослать свой хрустальный шар для ремонта, поэтому я не могу сказать наверняка, но я предсказываю, что если бы у была бы такая функция, это придет в форме функции Iif
Delphi Prism. Эта идея появляется ближе к концу обсуждения в Quality Central , и выдвигается возражение, что, как новое зарезервированное слово, оно нарушит обратную совместимость с кодом других людей, который уже определяет функцию с таким же название. Это не допустимый объект, потому что это не должно быть зарезервированным словом. Это может быть идентификатор, и точно так же, как Writeln
и Exit
, он может быть переопределен в других единицах, даже если один из системных единиц обрабатывается специально.