在Delphi中按值和引用调用相同的函数

时间:2016-05-25 18:12:20

标签: delphi

是否可以通过参数调用带有参数的相同函数定义以及稍后的运行时间? 类似的东西:

library(geosphere)
distm (c(40.777250, -73.872610), c(40.6895, -74.1745), fun = distHaversine)
         [,1]
[1,] 33713.61

...

2 个答案:

答案 0 :(得分:8)

不是相同的功能,没有。您需要使用重载函数,例如:

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;

b := 'cde';
myfunc(b);
Caption := b; //prints 'cde'

b := 'cde';
myfunc(@b);
Caption := b; //prints 'abc'

答案 1 :(得分:3)

首先请注意,由于声明的方式,您的函数 无法通过引用调用

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的答案不同,它使用不同的函数名而不是重载,因为编译器无法检测要调用的2个函数中的哪一个。但是,我强烈认为 这是一件好事 。您可以为程序的可维护性做的最糟糕的事情之一是编写具有根本不同的同名函数。弄清楚特定代码行上发生的事情会让人很困惑。