Есть ли или там когда-либо будет, условный оператор в Delphi?

Я не приближался к 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 (дженерики), итак, почему бы не добавить эту опцию?

32
задан Ether 30 January 2010 в 18:37
поделиться

7 ответов

Такой оператор не является частью текущей версии 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 и и и , он может иметь право быть перенесено в другие устройства, хотя один из системного блока обрабатывается специально.

41
ответ дан 27 November 2019 в 20:27
поделиться

Там нет условного оператора в 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]

4
ответ дан 27 November 2019 в 20:27
поделиться

Там есть отчет QC на этом ( 8451 ) у которого есть разумное обсуждение.

Поднял июнь 2004 года, и нет никакого ответа от Borland / Codegear / Embarcadero.

5
ответ дан 27 November 2019 в 20:27
поделиться

Существует ряд доступных простых типовых ручек на функции перегруженной 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.

5
ответ дан 27 November 2019 в 20:27
поделиться

Лучше еще представляет собой перегруженный IIF (встроенный, если), который поддерживает несколько типов данных и результатов.

0
ответ дан 27 November 2019 в 20:27
поделиться

На самом деле для струн можно использовать: Strutils.ifthen Функция:

function IfThen(AValue: Boolean;
        const ATrue: string;
        AFalse: string = ): string; overload;

Посмотрите в Delphi Help Wiki: http: //docwiki.embarcadero. COM / VCL / EN / STRUTILS.IFTHEN

Это делает именно то, что вам нужно.

1
ответ дан 27 November 2019 в 20:27
поделиться

Я бы предпочел, чтобы они могли реализовать ленивую оценку, и она будет более мощной и может использоваться в разном сценарии. Смотрите детали как ниже ссылку

http://www.digitalmars.com/d/2.0/lazy-evaluation.html

Ура

4
ответ дан 27 November 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: