【问题标题】:Skip default parameters in Delphi跳过 Delphi 中的默认参数
【发布时间】:2011-01-13 15:48:37
【问题描述】:

有没有办法跳过默认参数,假设我的方法声明是这样的:

procedure MyProc1(var isAttr1: Boolean = FALSE;
    var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE);

我不能这样调用函数:

Self.MyProc1( , , Attr3);

因为我不想要不必要的 var 声明,同时我想要最后一个 param 返回值(它是一个 var 类型)

提前感谢您的帮助。

【问题讨论】:

  • var 参数不能有默认值(当然!)。
  • var没有传递最后一个参数,只有第一个是。
  • 抱歉,我已经编辑了问题
  • 呃,var 参数不能有默认值。
  • 但是 PaxEngine(Pax 编译器)允许我这样做,并且偏离课程的代码在此情况下表现异常。想避开@David 和@Andreas 你是对的

标签: delphi


【解决方案1】:

抱歉,您不能这样做。更重要的是,您不能像使用 isAttr1 那样拥有带有默认值的 var 参数。

如果您的参数有足够不同的参数类型,那么您可以使用overloaded methods 作为默认参数的替代方案,这是我个人更喜欢的一种技术。但是你的参数都是布尔值,所以你不能在这里做。

其他海报提出了这样的建议:

procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr3: Boolean); overload;

这将编译和工作,但会违反最小意外原则。对于像这样的重载过程,您会期望,对于只有一个参数的过程,该单个参数是具有多个参数的过程的第一个参数。换句话说,您会期望:

procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr1: Boolean); overload;

【讨论】:

    【解决方案2】:

    在这种情况下,您应该使用overload 指令:

    Overload 指令允许您 有相同的不同版本 命名函数或过程 不同的论点。

    【讨论】:

      【解决方案3】:

      是的,创建一个重载版本的 MyFunc1(isAttr3 : boolean = FALSE);超载;

      让它组成虚拟参数并为您传递它们。

      正如另一张海报指出的那样,您可以使用 VAR 做到这一点。
      此外,如果它不是函数,则称它为 MyFunc 是错误的。称之为 MyProc!

      我的解决方案:

      function ov(p1 : boolean; p2 : boolean; p3 : boolean) : boolean; overload;
      begin
        result := p1 or p2 or p3;
      end;
      
      function ov(p3 : boolean) : boolean; overload;
      begin
        result :=  ov(false, false, p3);
      end;
      

      现在您可以选择:

      ov(TestBool3)

      ov(TestBool1, TestBool2, TestBool3)

      【讨论】:

      • 但这不起作用,因为参数不明确 - 另一个重载有 3 个布尔参数,所有参数都有默认值。
      • 我会放弃默认值和 var 参数,只将其设为返回布尔值的函数。我相信你可以有两个重载版本,一个有一个参数,一个有 3 个。
      • @Chris 这是正确的,但在处理提出的问题时还有其他问题;查看我的答案的编辑
      • 我不想声明不必要的变量,因为这会在代码审查中被拒绝,真正的概念是(function--sorry)过程将在三个diff中调用。场景并相应地使用这三个var参数,我不能再写三个重载函数
      • @Vijay 如果你不能使用 3 个重载并且你不能有未使用的变量,那么你看起来你必须放弃。
      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多