【问题标题】:Undetermined number of parameters参数数量未定
【发布时间】:2014-03-13 16:32:25
【问题描述】:

不知何故,System.String:Format 存在但似乎不起作用。

DEFINE VARIABLE strValue AS CHARACTER NO-UNDO.
strValue = "Sebastien".
MESSAGE System.String:Format("Hello {0}", strValue) VIEW-AS ALERT-BOX.

结果是“Hello C:\temp\run.p”而不是“Hello Sebastien”。

所以我决定创建一个等效函数。

如何声明一个参数数量不确定的方法?

例子:

METHOD PUBLIC INTEGER Calculate(
    INPUT iMultiply AS INTEGER
    ,INPUT iInt1 AS INTEGER
    ,INPUT iInt2 AS INTEGER
    ...
    ,INPUT iIntX AS INTEGER):

    RETURN iMultiply * (iInt1 + iInt2, ..., iIntX).

END METHOD.

DISPLAY Calculate(10, 1, 2, 3). /* Result: 60 */
DISPLAY Calculate(2, 1, 1, 1, 1, 1). /* Result: 10 */

谢谢! 塞巴斯蒂安

【问题讨论】:

  • 如果不可能的话,有没有办法在extent中使用关键字new?示例:DISPLAY Calculate(10, NEW EXTENT INTEGER(1, 2, 3))。 ?
  • 并将方法的签名更改为:Calculate(INPUT iMultiply AS INTEGER, INPUT iInt AS INTEGER EXTENT))。

标签: progress-4gl openedge


【解决方案1】:

我不完全确定您要在这里完成什么。对于您的第一段代码,您可以简单地执行以下操作:

DEFINE VARIABLE strValue AS CHARACTER NO-UNDO.
strValue = "Sebastien".
MESSAGE "Hello " + strValue VIEW-AS ALERT-BOX.

或者有时使用 SUBSTITUTE 函数很有用...

DEFINE VARIABLE strValue AS CHARACTER NO-UNDO.
strValue = "Sebastien".
MESSAGE SUBSTITUTE("Hello &1", strValue) VIEW-AS ALERT-BOX.

当您在代码示例中使用{0} 时,您使用的是运行时参数(如果您愿意,可以作为参数。{0} 是程序的名称,{1} 是程序的第一个参数,等等。我不建议使用运行时参数 - 你不能编译该代码。

关于函数的可变参数数量,这在 OpenEdge ABL 中无法完成。但是,您可以创建具有重载方法的类。它可能不像您想要的那样干净和优雅,但它会起作用。你会创建一个包含一堆这样的重载方法的类:

METHOD PUBLIC VOID Calc(deValue1 AS DECIMAL):
    ...do some stuff...
END METHOD.

METHOD PUBLIC VOID Calc(deValue1 AS DECIMAL, deValue2 AS DECIMAL):
    ...do some stuff...
END METHOD.

METHOD PUBLIC VOID Calc(deValue1 AS DECIMAL, deValue2 AS DECIMAL, deValue3 AS DECIMAL):
    ...do some stuff...
END METHOD.

等等。上面的代码将为您提供具有 1、2 或 3 个参数的相同方法 (Calc())。

希望这会有所帮助。

【讨论】:

  • 对此的另一个转折是拥有一个将所有可能的参数值作为属性的类,设置您要使用的那些,然后将整个类传递给您的例程。
【解决方案2】:

您不能在 ABL 中拥有参数数量不确定的方法。

【讨论】:

  • 如果我们不能,那SUBST为什么要这样做?它是否使用了非abl代码。 SUBST("&1, &2,...., &N", param1, param2, ....., paramN)
【解决方案3】:

如果您可以解决根本原因,则不应寻找解决方法。

这将按预期工作:

MESSAGE System.String:Format("Hello ~{0~}", "Sebastien") VIEW-AS ALERT-BOX INFO BUTTONS OK.

与您的版本不同的是花括号前的波浪字符。大括号在 OpenEdge 中具有特殊含义,因为它们用于编译时函数(包括、预处理器指令)。 {0} 在编译时被过程名称替换。 波浪号用于转义花括号。

这是来自 OpenEdge 帮助:

{ } 参数参考

引用过程传递给被调用的外部过程文件或包含文件的参数值。 ABL 将每个参数转换为字符格式。如果在 RUN 语句或包含文件引用中将参数指定为字符串常量,则此转换将删除周围的双引号。 当一个过程被另一个过程调用并使用参数时,ABL 重新编译被调用过程,替换调用过程传递的参数,然后运行被调用过程。

~特殊字符

波浪号 (~) 是一个转义字符,它会导致 AVM 逐字读取以下字符。波浪号后跟三个八进制数字表示单个字符。使用它作为导入表 2 中所示的特殊字符的前导。在过程中,将忽略后面跟有表 2 中项目以外内容的波浪号。例如,“~abc”被视为“abc”。 (将参数传递给包含文件时,这可能无法按预期工作。)表 2 中的项目区分大小写。

【讨论】:

  • 哇!谢谢法比安!
【解决方案4】:

如果您的所有参数都是相同的数据类型,您可以使用“不确定数组”。 像这样定义方法参数:

METHOD PUBLIC VOID Calc(INPUT numberArray AS INTEGER EXTENT):
  DEFINE VARIABLE iEntriesInArray AS INTEGER NO-UNDO.
  DEFINE VARIABLE iCnt            AS INTEGER NO-UNDO.
  DEFINE VARIABLE iTemp           AS INTEGER NO-UNDO.
  iEntriesInArray = EXTENT(numberArray).
  DO iCnt = 1 TO iEntriesInArray:
    iTemp = numberArray[iCnt].
  END.
END METHOD.

然后这样称呼它:

DEFINE VARIABLE numberArray AS INTEGER EXTENT NO-UNDO.
DEFINE VARIABLE arrayExtent AS INTEGER     NO-UNDO.
arrayExtent = 5.
EXTENT(numberArray) = arrayExtent.
myClass1:Calc (INPUT numberArray).

【讨论】:

  • 感谢JKO的建议。
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多