Пропустить параметры по умолчанию в Delphi

#object #delphi #pascal

Вопрос:

Есть ли какой-либо способ пропустить параметры по умолчанию, скажем, предположим, что мое объявление метода выглядит следующим образом:

 procedure MyProc1(var isAttr1: Boolean = FALSE;
    var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE);
 

Я не могу вызвать функцию таким образом:

 Self.MyProc1( , , Attr3);
 

поскольку мне не нужны ненужные объявления var, в то же время мне нужно последнее возвращаемое значение параметра (это тип var).

Заранее благодарю за помощь.

Комментарии:

1. var параметры не могут иметь значений по умолчанию (конечно!).

2. И последний параметр не проходит мимо var , только первый.

3. извините за то, что я отредактировал вопрос

4. Э-э, у вас не может быть значений по умолчанию для параметров var.

5. но PaxEngine (пакс-комплиер) позволяет мне это делать, и при этом код, не соответствующий курсу, ведет себя ненормально. Думал, чтобы избежать @David и @Andreas, вы правы

Ответ №1:

Извини, ты не можешь этого сделать. Более того, у вас не может быть var параметра по умолчанию, как у вас есть isAttr1 .

Если бы ваши параметры имели достаточно разные типы параметров, вы могли бы использовать перегруженные методы в качестве альтернативы параметрам по умолчанию, что лично мне больше нравится. Но все ваши параметры являются логическими, и поэтому вы не можете сделать это здесь.

Другие плакаты предполагали что-то подобное:

 procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr3: Boolean); overload;
 

Это будет компилироваться и работать, но будет противоречить принципу наименьшего удивления. Для перегруженных процедур, подобных этой, можно было бы ожидать, что для процедуры только с одним параметром этот единственный параметр будет первым параметром процедуры с несколькими параметрами. Другими словами, вы ожидали бы:

 procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr1: Boolean); overload;
 

Ответ №2:

В этом случае следует использовать директиву перегрузки:

Директива перегрузки позволяет иметь разные версии одной и той же именованной функции или процедуры с разными аргументами.

Ответ №3:

Да, сделайте перегруженную версию myFunc1(isAttr3 : логическое значение = FALSE); перегрузка;

Пусть он придумает фиктивные параметры и передаст их вам.

Как указывает другой плакат, вы можете сделать это с помощью VAR.
Кроме того, неправильно называть это myFunc, если это не функция. Назови это MyProc!

Мое решение:

 function ov(p1 : boolean; p2 : boolean; p3 : boolean) : boolean; overload;
begin
  result := p1 or p2 or p3;
end;

function ov(p3 : boolean) : boolean; overload;
begin
  result :=  ov(false, false, p3);
end;
 

Теперь у вас есть выбор:

ov(TestBool3)

или

ov(TestBool1, TestBool2, TestBool3)

Комментарии:

1. Но это не сработает из — за неоднозначности параметров-другая перегрузка имеет 3 логических параметра, все со значениями по умолчанию.

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

3. @Chris это правильно, но есть и другие проблемы при рассмотрении вопроса в том виде, в каком он был задан; см. правку моего ответа

4. Я не хочу объявлять ненужные переменные, потому что это будет отклонено в обзоре кода, реальная концепция заключается в том, что процедура (функция-извините) будет вызвана в трех разных вариантах. сценарии и использовать эти три параметра var соответственно, я не могу снова написать три перегруженные функции

5. @Vijay Если вы не можете использовать 3 перегрузки и у вас не может быть неиспользуемых переменных, то вам, похоже, придется сдаться.