Форум: "Потрепаться";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизРазница между 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c