Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.26;
Скачать: CL | DM;

Вниз

Разница между Function и Function()   Найти похожие ветки 

 
REA ©   (2003-12-04 15:09) [0]

В чем разница между вызовом функции без параметров со скобочками и без?


 
ИдиотЪ ©   (2003-12-04 15:13) [1]

если нет дополнительных символов типа @, одно суть


 
euru ©   (2003-12-04 15:15) [2]

Если это относится к Delphi, то синтаксически никакой. Лично я использую вариант function(): так проще различать процедуры и функции от свойств и переменных.


 
Anatoly Podgoretsky ©   (2003-12-04 15:20) [3]

Нарушает эстетику.


 
REA ©   (2003-12-04 15:21) [4]

Оказывается в некоторых случаях все же есть разница.
Если функция возвращает функцию, которая фозвращает что-то, то в зависимости от использования скобок компилятор будет определять тип того что возвращается: сама функция или ее вызов (результат) и может выдать несовпадение типов, если не поставить скобки.
Интересно какая еще разница?


 
blackman ©   (2003-12-04 15:23) [5]

>Интересно какая еще разница?
Не томи. Какую еще знаешь ?


 
ИдиотЪ ©   (2003-12-04 15:26) [6]

REA ©
все что есть, уже описано, ничего нового не найдет


 
Sergey_Masloff   (2003-12-04 15:26) [7]

REA © (04.12.03 15:21) [4]
по-моему у тебя написана пурга. Давай пример в студию ;-)


 
REA ©   (2003-12-04 15:27) [8]

Я пока никакой больше не знаю :) Удивило что компилятор различает эти ситуации и выдает ошибку, если пытаешься присвоить чему-то, а если не пытаешься, то просто код не отрабатывается как ожидалось (хотя может возвращать указатель на функцию уже не модно и смахивает на Си).


 
REA ©   (2003-12-04 15:31) [9]

Упрощенно так:

TfnGetParamList = Function: TParamDescrArray; // динамический массив

Function GetImportFn: TfnGetParamList;
Begin
// от выбора пользователя возвращается plugin функция
Result := TSystemLibrary(Items.Objects[ItemIndex]).ImportParams;
End;

Procedure TdlgSetupParams.btnImportClick(Sender: TObject);
Begin
GetImportFn(); // тут есть разница
End;


 
ИдиотЪ ©   (2003-12-04 15:34) [10]

нет здесь неоднозначности


 
Sergey_Masloff   (2003-12-04 15:35) [11]

REA © (04.12.03 15:31) [9]
Хм... интересно. Надо будет проверить ;-)


 
PVOzerski ©   (2003-12-04 15:40) [12]

Допустимость использования "пустых" скобок была введена в синтаксис Object Pascal не сразу. В Turbo Pascal такое использовать просто нельзя, я не уверен и в допустимости ее в D1/D2. Интересная особенность есть в синтаксисе языка FreePascal (при режиме компилятора FPC и, по-моему, ObjFPC): при использовании имени функции внутри ее тела в правой части выражения, без скобок она трактуется как возвращаемая переменная (Result), со скобками - как рекурсивный вызов. IMHO, BTW, это нарушает не только совместимость с паскалями от Borland, но и со стандартным. касательно же Delphi - я думаю (но проверять не буду), что речь идет о вот такой коллизии:

type
tFunc=function:pointer;
function MyFunc:tFunc;
begin
...
end;
var
Func1,Func2:tFunc;
begin
Func1:=tFunc(MyFunc);
Func2:=tFunc(MyFunc());
...


 
ИдиотЪ ©   (2003-12-04 16:03) [13]

ту PVOzerski ©
вот все, что допускается, по крайней мере в Дельфи 5

Func1,Func2: tFunc;
begin
Func1:=@MyFunc;
Func2:=MyFunc();
Func2:=Func1;
Func2:=Func1();

end;

а вышеприведенный не будет компилироваться,
Func1:=tFunc(MyFunc) - недопустимое присваивание
найдите реальное несоответсвие


 
PVOzerski ©   (2003-12-04 16:22) [14]

Согласен: пример не компилируется. Но вот что любопытно.
Я немного упростил пример.
type
tFunc=function:pointer;
function MyFunc:tFunc;
begin

end;
var
Func1:tFunc;
begin
Func1:=MyFunc();
end.

Так вот, если я скобки оставляю, пример компилируется, если убираю, компилятор (D6) кричит о несоответствии типов Pointer и tFunc. Значит, в 1-м случае он присваивает переменной Func1 значение, возвращаемое функцией MyFunc и имеющее тип tFunc, а во 2-м полагает, что я хочу присвоить переменной Func1 значение (pointer), возвращаемое той функцией, точку входа в которую мне должна вернуть функция MyFunc... Ну и путаница :^) Но разницу все-таки я поймал!


 
ИдиотЪ ©   (2003-12-04 16:36) [15]

PVOzerski © (04.12.03 16:22) [14]
согласен, некоторые особенности синтаксиса путают
например то же обращение к объектам не через указатель, чем они на самом деле являются, да еще к массивам можно обращаться через указатель без явной разадресации, не помню точно, но есть


 
Кот Бегемот ©   (2003-12-04 17:56) [16]

И мое скромное IMHO :)

Как уже писАлось уважаемым Озерским - разница только для процедурных типов и свойств.
Со скобочками воспринимается как вызов функции (результат - тип возвращаемого значения), без скобочек - как значение адреса перехода, еще одно дополнение:

property Anywhere: integer read SetAnywhere;

в этом случае тоже скобочек не должно быть !!! - т.к. механизм property немножко другой.

Сам пользуюсь только со скобочками и никаких особенностей не наблюдал до этого.



Страницы: 1 вся ветка

Текущий архив: 2003.12.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
8-86460
Mishel
2003-08-28 10:19
2003.12.26
CreateDIBSection - 8 бит - палитра ?


6-86469
Lena19
2003-10-25 22:32
2003.12.26
как убить сокет


14-86542
Shirson
2003-12-04 17:03
2003.12.26
Строчка из хелпа - 10 баллов! :)


14-86543
Думкин
2003-12-03 06:07
2003.12.26
С днем рождения! 3 декаабря.


1-86416
Макс2
2003-12-13 18:43
2003.12.26
StringGrid