Я не приближался к Delphi слишком долго, я предполагаю; занятый я с Java и PHP много за последние несколько лет. Теперь, когда я возвратился к выполнению небольшого задания Delphi, я понял, что действительно пропускаю условный оператор, который поддерживается и Java и PHP.
На том, сколько мест Вы нашли бы строки как они в Ваших программах Delphi?
var s : string;
begin
...<here the string result is manipulated>...
if combo.Text='' then
s := 'null'
else
s := QuotedStr(combo.Text);
result := result + s;
end;
где простое
result := result + (combo.text='')?'null':quotedStr(combo.text);
был бы достаточен. Что я люблю, приблизительно это - то, что это не только сокращает код, этот способ, которым я также стараюсь не объявлять некоторого помощника s:string
переменная.
Почему условные операторы не, часть Delphi и - они когда-либо будет поддерживаемой? Я заметил, что было довольно много расширений языка, сделанных для версии 2009 года Delphi (дженерики), итак, почему бы не добавить эту опцию?
Такой оператор не является частью текущей версии Delphi, потому что она не была частью предыдущей версии, а спрос не был достаточно большим, чтобы оправдать стоимость добавления. (Вы обнаружите, что объяснение применяется к лотам функций, которые вы пожелаете в лотов продуктов.)
Delphi предоставляет набор функций IFTHEN
В подразделениях математики и Strutils, но они имеют несчастную свойство оценки как параметров их значения, поэтому код, как этот код, потерпит неудачу:
Foo := IfThen(Obj = nil, '<none>', Obj.Name);
, чтобы действительно сделать это правильно, должен быть помощь от компилятора. В рамках сообщества Delphi я чувствую общую неприязнью синтаксис C-стиля C, используя знак вопроса и толстой кишки. Я видел предложения, которые использовали бы синтаксис такой:
Foo := if Obj = nil then
'<none>'
else
Obj.Name;
часть того, что делает условные операторы так привлекательными, состоит в том, что они позволили вам написать краткий код, но стиль записи Delphi, даже если он делает вышеупомянутой линия.
На самом деле не нужно быть в форме оператора . Prism Delphi предоставляет функцию Compiler-Magic IIF
, которая оценивает только одно из двух параметров значения:
Foo := Iif(Obj = nil, '<none>', Obj.Name);
Вы спрашивали, почему функция, подобная, не была бы добавлена вместе со всеми другими языковыми функциями, добавленными в Delphi 2009. Я думаю, что это ваша причина. Было много других языковых изменений, происходящих на этом уже требовании деликатного обращения; Разработчики не должны были быть обременены еще больше. Особенности не бесплатны.
Вы спрашивали, будет ли Delphi когда-либо иметь такую особенность. Я не приважу к заседаниям планирования эмбаркадеро, и мне пришлось отправить мой хрустальный мяч для ремонта, поэтому я не могу сказать наверняка, но я предсказываю, что если это когда-либо будет , есть такая особенность, Это придет в виде функции Delphi Prism's IIF
. Эта идея появляется недалеко от конца обсуждения в Центральном дискуссии , а возражение, в качестве нового зарезервированного слова он нарушит обратную совместимость с кодом других людей, который уже определяет функцию с тем же имя. Это не допустимый объект, однако, потому что это не должно быть зарезервированным словом. Это может быть идентификатор, и, как WRITELN
и и
и
, он может иметь право быть перенесено в другие устройства, хотя один из системного блока обрабатывается специально.
Там нет условного оператора в Delphi, и я серьезно сомневаюсь, что когда-нибудь будет один, но вы никогда не узнаете. Вы всегда можете выдать запрос на Embarcadero.
Альтернативой состоит в том, чтобы определить функцию IFF:
function Iff(const ACondition: Boolean; const ATrueValue, AFalseValue: XXX): XXX;
begin
if ACondition then
Result := ATrueValue
else
Result := AFalseValue;
end;
, где XXX - тип Desirec.
Используйте как:
Result := Result + Iff(combo.text='', 'null', quotedStr(combo.text));
Есть несколько причин, почему не реализовать условный оператор. Одним из них является читаемость. Паскаль (а также Delphi) более сосредоточен на читабельности, чем языки C синтаксиса C, которые более центрированы на мощности символов (как можно больше информации на символ). Условный оператор мощный, но (по некоторым) нечитается. Но если вы посмотрите на (страшно) с заявлением в Delphi ... (не нужно говорить больше). Еще одна причина в том, что условный оператор не требуется. Что является правдой. Но там больше не требуется, что все еще реализовано.
В конце концов это просто вопрос вкуса.
Но если вы хотите, чтобы один аргумент был оценен, вы всегда можете использовать следующие, которые нарушают как читаемость, как концепция питания персонажа:
[OverdesignMode]
// Please don't take this that serious.
type
TFunc = function(): XXX;
function Iff(const ACondition: Boolean; const ATrueFunc, AFalseFunc: TFunc): XXX;
begin
if ACondition then
ATrueFunc
else
AFalseFunc;
end;
[/ OverdesignMode]
Там есть отчет QC на этом ( 8451 ) у которого есть разумное обсуждение.
Поднял июнь 2004 года, и нет никакого ответа от Borland / Codegear / Embarcadero.
Существует ряд доступных простых типовых ручек на функции перегруженной IFTHEN.
Strutils.ifthen
( string
)
Math.ifthen
( Integer
)
Math.ifthen
( INT64
)
Math .ifthen
( Двойной
) (работает для TDateTime
)
Эта модель падает, как показано в примере, что Andreas прокомментировал На, но для простых типов это больше, чем разумно. Если следует следить за методами «Delphi / Pascal», а не поддается следующим способам использования наименьшего количества символов.
Лично я бы предпочел не видеть условного оператора (то есть I. ?:
) введен в Delphi, поскольку я предпочитаю читаемость Delphi / Pascal над C и IT производных языков. Я бы предпочел увидеть более инновационные решения Delphi Type для чего-то вроде этого, чем реализовать больше C-ISMS.
Лучше еще представляет собой перегруженный IIF (встроенный, если), который поддерживает несколько типов данных и результатов.
На самом деле для струн можно использовать: Strutils.ifthen Функция:
function IfThen(AValue: Boolean;
const ATrue: string;
AFalse: string = ): string; overload;
Посмотрите в Delphi Help Wiki: http: //docwiki.embarcadero. COM / VCL / EN / STRUTILS.IFTHEN
Это делает именно то, что вам нужно.
Я бы предпочел, чтобы они могли реализовать ленивую оценку, и она будет более мощной и может использоваться в разном сценарии. Смотрите детали как ниже ссылку
http://www.digitalmars.com/d/2.0/lazy-evaluation.html
Ура