未确定的参数数量

时间:2014-03-06 12:47:24

标签: progress-4gl openedge

不知何故,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 */

谢谢! 的Sebastien

4 个答案:

答案 0 :(得分:4)

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

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())。

希望这有帮助。

答案 1 :(得分:2)

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

这将按预期工作:

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中的项目区分大小写。

  

答案 2 :(得分:1)

您不能在ABL中使用具有未确定数量的参数的方法。

答案 3 :(得分:0)

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

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).