Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.01 c
1-86334
Mishenka
2003-12-12 21:43
2003.12.26
Как обнулить содержимое StringGrid?


1-86399
Islander
2003-12-08 12:06
2003.12.26
Изменение размеров кнопок под размер системного шрифта


14-86525
SergP
2003-12-01 22:46
2003.12.26
Помогите написать Select


14-86531
IronHawk
2003-11-27 16:10
2003.12.26
Определение слова


1-86396
azazello
2003-12-12 23:02
2003.12.26
Протокол работы программы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский