不知何故,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
答案 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).