将 TStack 代码从 Delphi 转换为 Lazarus
Converting TStack code from Delphi to Lazarus
在 Delphi 中,我有以下代码,一切正常:
var
StackOptions:TStack<String>;
s:string;
bfisio:boolean;
begin
StackOptions:=TStack<String>.Create;
//some pushs here
for s in StackOptions do begin
dosomething;
end;
end;
在 Lazarus 中我可以这样做:
uses
..., gstack;
type
TStringStack = specialize TStack<String>;
var
StackOptions: TStringStack;
s:string;
begin
//But this code doesn;t compile
StackOptions := TStringStack.Create;
//some pushs here
for s in StackOptions do begin // <-- Error
dosomething;
end;
end;
我在 Lazarus 中遇到下一个错误:
Compile Project, Target: TicketLaz.exe: Exit code 1, Errors: 1
umain.pas(263,12) Error: Cannot find an enumerator for the type "TStack$crcAC3AF268"
如何在不从 Stack 中删除项目的情况下循环 Stack 并使用 Lazarus 搜索值?
FPC 的堆栈由 TVector 支持。
TVector 有一个枚举器。
您可以像这样轻松添加 class 助手:
快速而肮脏的代码。
type
TStringStack = specialize TStack<String>;
type
{ TStackHelper }
TVectorEnumerator = specialize TVector<string>.TVectorEnumerator;
TStackHelper = class helper for TStringStack
function GetEnumerator: TVectorEnumerator;
end;
{ TStackHelper }
function TStackHelper.GetEnumerator: TVectorEnumerator;
begin
Result:= FData.GetEnumerator;
end;
我真的不明白为什么堆栈不应该有迭代器。
即使在汇编中你也可以简单地做 mov reg,[esp-04]
.
这种严格的数据结构方法对任何人都没有帮助
由于 TStack 是通用的,这一切都变得复杂了。
我知道 FPC 允许通用 class 助手,但我不确定如何使解决方案适用于所有 TStack<T>
另一种方法是简单地编辑 gstack.pas
以公开迭代器。
在 Delphi 中,我有以下代码,一切正常:
var
StackOptions:TStack<String>;
s:string;
bfisio:boolean;
begin
StackOptions:=TStack<String>.Create;
//some pushs here
for s in StackOptions do begin
dosomething;
end;
end;
在 Lazarus 中我可以这样做:
uses
..., gstack;
type
TStringStack = specialize TStack<String>;
var
StackOptions: TStringStack;
s:string;
begin
//But this code doesn;t compile
StackOptions := TStringStack.Create;
//some pushs here
for s in StackOptions do begin // <-- Error
dosomething;
end;
end;
我在 Lazarus 中遇到下一个错误:
Compile Project, Target: TicketLaz.exe: Exit code 1, Errors: 1
umain.pas(263,12) Error: Cannot find an enumerator for the type "TStack$crcAC3AF268"
如何在不从 Stack 中删除项目的情况下循环 Stack 并使用 Lazarus 搜索值?
FPC 的堆栈由 TVector 支持。
TVector 有一个枚举器。
您可以像这样轻松添加 class 助手:
快速而肮脏的代码。
type
TStringStack = specialize TStack<String>;
type
{ TStackHelper }
TVectorEnumerator = specialize TVector<string>.TVectorEnumerator;
TStackHelper = class helper for TStringStack
function GetEnumerator: TVectorEnumerator;
end;
{ TStackHelper }
function TStackHelper.GetEnumerator: TVectorEnumerator;
begin
Result:= FData.GetEnumerator;
end;
我真的不明白为什么堆栈不应该有迭代器。
即使在汇编中你也可以简单地做 mov reg,[esp-04]
.
这种严格的数据结构方法对任何人都没有帮助
由于 TStack 是通用的,这一切都变得复杂了。
我知道 FPC 允许通用 class 助手,但我不确定如何使解决方案适用于所有 TStack<T>
另一种方法是简单地编辑 gstack.pas
以公开迭代器。