Jer*_*dge 2 delphi function concatenation
我在一个连接JSON文本的对象中有一个函数.函数结果是一个String - 生成的JSON文本.该函数只是将文本附加到结果的末尾...
function TDestination.GetAsJSON: String;
procedure A(const Text: String);
begin
Result:= Result + Text + sLineBreak;
end;
begin
A(' {');
A(' "name":"'+EncodeStr(FName)+'",');
A(' "directory":"'+EncodeStr(FDirectory)+'",');
A(' "description":"'+EncodeStr(FDescription)+'"');
A(' }');
end;
Run Code Online (Sandbox Code Playgroud)
从另一个父对象中循环调用此函数...
function TDestinations.GetAsJSON: String;
procedure A(const Text: String);
begin
Result:= Result + Text + sLineBreak;
end;
var
X: Integer;
begin
A(' [');
for X := 0 to Count - 1 do begin
if X > 0 then A(' ,');
Result:= Result + Items[X].AsJSON;
end;
A(' ]');
end;
Run Code Online (Sandbox Code Playgroud)
在第二个函数中,Items[X].AsJSON调用第一个函数.
问题是第二次(以及所有进一步的)调用TDestination.GetAsJSON仍然使字符串位于上次调用函数结果中.
解决方案是Result:= '';在函数开头简单地初始化结果.但问题是我为什么要这样做?为什么这个字符串会被遗忘?
令人费解的是,对该函数的每个不同调用都来自该对象的完全独立的实例.我会理解它是否是完全相同的对象实例,但事实并非如此.
Guido Gybels在他的文章" 在Delphi中使用汇编程序 "表示具有长字符串类型结果的函数将其作为隐式var参数返回.因此编译器将您的函数视为:
(hidden)var
temp_s: String;
procedure GetAsJSON(var temps: String);
...
GetAsJSON(temp_s);
UsedResult1 := temp_s;
...
GetAsJSON(temp_s);
UsedResult2 := temp_s;
Run Code Online (Sandbox Code Playgroud)
因此隐藏的字符串可以在某些条件下保留其值.
无论如何,你不是依靠0的整数结果初始化,对吧?
编辑:记录此行为:Delphi帮助链接(处理函数结果部分)
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |