在Delphi中通过值和引用调用相同的函数
是否可以使用参数按值调用同一个函数定义,然后在运行时按引用调用? 比如:在Delphi中通过值和引用调用相同的函数,delphi,Delphi,是否可以使用参数按值调用同一个函数定义,然后在运行时按引用调用? 比如: function myfunc(a:string); begin a:='abc'; end; ... later: b:='cde'; myfunc(b); caption:=b; //prints 'cde' ... later: myfunc(@b); caption:=b; //prints 'abc' ??不是相同的函数,不是。您需要使用重载函数,例如: function myfunc(a: string);
function myfunc(a:string);
begin
a:='abc';
end;
...
later:
b:='cde';
myfunc(b);
caption:=b; //prints 'cde'
...
later:
myfunc(@b);
caption:=b; //prints 'abc'
??不是相同的函数,不是。您需要使用重载函数,例如:
function myfunc(a: string); overload;
begin
// use a as needed, caller is not updated...
a := 'abc';
end;
function myfunc(a: PString); overload;
begin
// modify a^ as needed, caller is updated...
a^ := 'abc';
end;
首先请注意,由于函数的声明方式,无法通过引用调用函数
function myfunc(a: string); overload;
您必须将此更改为:
function myfunc(var a: string); overload;
但如果要调用同一个函数,则需要使用作为输入副本的discard变量调用该函数
b := 'cde';
discard := b;
myfunc(discard);
caption := b; //uses 'cde'
但是,您可以创建第二个函数,该函数简单地为您包装第一个函数,并放弃by ref更改:
function myfunc2(s: string);
begin
Result := myfunc(s);
end;
//Now the earlier code becomes:
b := 'cde';
myfunc2(b);
caption := b; //uses 'cde'
请注意,与Remy的答案不同,这使用了不同的函数名,而不是重载,因为编译器无法检测要调用的两个函数中的哪一个。然而,我强烈认为这是一件好事。为了程序的可维护性,最糟糕的事情之一就是编写完全不同的同名函数。弄清楚特定代码行上发生了什么会让人非常困惑。谢谢,但我注意到了一些类似的东西,例如:myfunc(a,b),然后将其称为myfunc(c+2-pi,d+c-3)或myfunc(byref(c),d+c-3)。可能吗?(其中‘byref’是我需要的‘魔法函数’)@danmatei这和你在问题中所说的完全不同。您不是在寻找引用参数,而是在寻找回调函数。我建议你问一个全新的问题;这一次可以更好地解释你在寻找什么。
b := 'cde';
discard := b;
myfunc(discard);
caption := b; //uses 'cde'
function myfunc2(s: string);
begin
Result := myfunc(s);
end;
//Now the earlier code becomes:
b := 'cde';
myfunc2(b);
caption := b; //uses 'cde'