gpt4 book ai didi

delphi - 子范围和运算符重载

转载 作者:行者123 更新时间:2023-12-03 18:30:54 25 4
gpt4 key购买 nike

我可以声明以下重载以扩展集合的限制。

TMyInteger = record
private
Data: integer;
public
class operator In(a: TMyInteger; b: array of integer): boolean;
end;

class operator TMyInteger.In(a: TMyInteger; b: array of integer): boolean;
begin
Result:= false;
for i in b do
if a.data = i then exit(true);
end;


这允许以下语法:

if a in [500,600] then ....


有没有办法允许以下语法?

if a in [500..600] then ....     
//or some similar construct?

最佳答案

简短的答案是“否”,但是您可以实现类似的目标。它以格式('5,17-30,69')等处理范围。请注意,我使用'-'而不是'..'

请注意,我刚刚剪切和粘贴了已经使用多年的功能-为此目的,您可能会做得更好。

unit UnitTest2;

interface

uses
System.SysUtils;


type
TMyInteger = record
private
Data: integer;
public
class operator In(a: TMyInteger; const pVal : string): boolean;
end;

implementation

{ TMyInteger }

type EDSMListError = class(Exception);

function SplitDSMList( var List : string;
var First : integer;
var Last : integer ) : boolean;
var
i : integer;
ProcessingLast : boolean;
begin
// splits list of form like '1-3,5,9,11-23' and so on
// Returns TRUE if there has been a split, and false otherwise.
// Space characters are ignored

// If the above string were passed, the return values would be
// List = '5,9,11-23'
// First = 1
// Last = 3
// return = TRUE

// The next call would return
// List = '9,11-23'
// First = 5
// Last = 5

Result := FALSE;
First := 0;
Last := 0;
ProcessingLast := FALSE;

for i := 1 to Length( List ) do
begin
case List[i] of
'0'..'9':
begin
if ProcessingLast then
begin
Last := Last * 10 + Ord(List[i]) - Ord('0');
Result := TRUE;
end
else
begin
First := First * 10 + Ord(List[i]) - Ord('0');
Last := First;
Result := TRUE;
end;
end;
'-':
begin
ProcessingLast := TRUE;
Last := 0;
Result := TRUE;
end;
',':
begin
Result := TRUE;
List := Copy( List, i + 1, Length( List ) - i);
Exit;
end;
' ':
// ignore spaces
;
else
// illegal character
raise EDSMListError.Create('Illegal character found in list "' + List + '"');
end;
end;
// If we get here we have reached the end of the message, so...
List := '';
end;
function ValueInDSMList( const List : string; const Val : integer ) : boolean;
var
iList : string;
iBegin, iEnd : integer;
begin
iList := List;
Result := FALSE;
while SplitDSMList( iList, iBegin, iEnd ) do
begin
// assume sorted!
if Val < iBegin then
begin
exit;
end
else if Val <= iEnd then
begin
Result := TRUE;
exit;
end;
end;
end;

class operator TMyInteger.In(a: TMyInteger; const pVal: string): boolean;
begin
Result := ValueInDSMList( pVal, a.Data );
end;

end.


然后,您将使用类似

如果是“ 500-600”,则....

关于delphi - 子范围和运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35757870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com