gpt4 book ai didi

delphi - 如何初始化局部变量使用的 boolean 类型?

转载 作者:行者123 更新时间:2023-12-03 18:00:27 26 4
gpt4 key购买 nike

我正在尝试更改如何使用 boolean 参数来获得有意义的名称,因此我不需要检查每个方法 True/False 的含义。在此示例中,我使用 True/False:

procedure ProcessData(Param1, Param2: string; CreateOnEmpty: boolean = False);

procedure TForm1.Button1Click(Sender: TObject);
begin
ProcessData(P1, P2, True); // when CreateOnEmpty should be True
ProcessData(P1, P2); // when CreateOnEmpty should be False
ProcessData(P1, P2, False); // when CreateOnEmpty should be False
end;

但在这种情况下,我需要查找 ProcessData 方法以了解 True/False 参数的含义,执行。

因此,我从这个示例开始,为参数分配有意义的名称:
procedure TForm1.Button2Click(Sender: TObject);
var
vCreateWhenEmpty: boolean;
vDontCreateWhenEmpty: boolean;
begin
// Init control params
vCreateWhenEmpty := True;
vDontCreateWhenEmpty := False;

ProcessData(P1, P2, vCreateWhenEmpty); // When CreateOnEmpty should be True
ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;

但是,我想避免初始化局部变量,并且正在考虑这样的事情:
procedure TForm1.Button3Click(Sender: TObject);

Type
TBoolTrue = Boolean = True; // Init to True and all local vars will be True
TBoolFalse = Boolean = False; // Init to False and all local vars will be False

var
vCreateWhenEmpty: TBoolTrue; // Variable should default to True
vDontCreateWhenEmpty: TBoolFalse; // Variable should default to False
begin
ProcessData(P1, P2, vCreateWhenEmpty); // When CreateOnEmpty should be True
ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;

所以,我可以跳过分配值 True/False。

我有 100 种接受 boolean 参数的方法,所以 100 种可以用作参数的常量或全局变量听起来有点矫枉过正。

是否有可能以某种方式将 boolean 类型初始化为 True/False 或避免使用其他技巧来初始化局部变量?

编辑:

我在示例中将 boolean 类型设置为局部类型,我的意思是将它们设置为全局类型,因此它们仅在每个方法中设置一次,而不是每次设置。
所以,这将是全局性的,而不是本地的:
Type
TBoolTrue = Boolean = True; // Init to True and all local vars will be True
TBoolFalse = Boolean = False; // Init to False and all local vars will be False

编辑 2:

我希望这个问题不会结束,因为答案中有一些很好的建议。所以我的选择是:
  • 全局常量(我最终会得到 100 个新常量)
  • 全局枚举字段(即使我最终会得到 100 个,与 const 一样,如果我添加第三个值,它们可以更容易地扩展值)
  • 本地常量(我喜欢它的短,每个常量 1 行,它是本地的,而不是全局的)
  • 局部变量(每个变量 2 行,定义和值初始化 - 太多)
  • 本地枚举字段(我喜欢这个,因为它可以用第三个或第四个值扩展...)
  • Rufo 先生的自动初始化记录示例(虽然有点过头了,但正是我想要的;不幸的是,这是一个真正过头的实现;性能可能会受到影响,但有可用的解决方案 - 不错)
  • 保持原样并依靠代码洞察力来快速理解参数 - 不幸的是,在 XE7 中不稳定且不能依赖;也许在较新的版本中会更好,但是从对较新版本的反馈来看,我怀疑它是否会按预期工作。

  • 决定

    尽管 Rufo 爵士关于如何做我所想的事情的技巧是独一无二的,但我意识到我正在尝试实现当前 Delphi 版本所不具备的东西。因此,我将使用 const 和枚举类型的组合,并且仅在真正需要的地方应用,而不是在任何地方应用,并且将避免使用 100 多个全局局部变量。

    最佳答案

    无法自动初始化局部变量。

    但是我们可以创建一个行为类似于自动初始化的局部变量的记录。

    type
    TBoolDefaultTrue = record
    private const
    InitializedFlag = '*';
    DefaultValue = True;
    private
    FIsInitialized: string;
    FValue: Boolean;
    procedure EnsureInitialized;
    public
    class operator implicit ( const v: Boolean ): TBoolDefaultTrue;
    class operator implicit ( const v: TBoolDefaultTrue ): Boolean;
    end;

    procedure EnsureInitialized;
    begin
    if FIsInitialized = ''
    then
    begin
    FValue := DefaultValue;
    FIsInitialized := InitializedFlag;
    end;
    end;

    class operator TBoolDefaultTrue.Implicit( const v: Boolean ): TBoolDefaultTrue;
    begin
    Result.FValue := v;
    Result.FIsInitialized := InitializedFlag;
    end;

    class operator TBoolDefaultTrue.Implicit( const v: TBoolDefaultTrue ): Boolean;
    begin
    v.EnsureInitialized;
    Result := v.FValue;
    end;

    您可以在不更改方法签名的情况下使用它
    procedure TForm1.Button3Click(Sender: TObject);
    var
    vCreateWhenEmpty: TBoolDefaultTrue;
    vDontCreateWhenEmpty: TBoolDefaultFalse;
    begin
    ProcessData(P1, P2, vCreateWhenEmpty); // When CreateOnEmpty should be True
    ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
    end;

    这只是您可以选择的一个选项,但对我来说,这不是我想要的。我喜欢肯在他的回答中描述的枚举方式。我只会选择不同的名字。
    TProcessDataOption = ( pdoDontCreateWhenEmpty, pdoCreateWhenEmpty );

    但这只是糖

    关于delphi - 如何初始化局部变量使用的 boolean 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38515568/

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