Return 未找到匹配项时的默认值

Return Default Value When No Match Found

我有一个函数 GetQuantity,它 return 是一个小数。在某些情况下,我不想 return 什么,即空字符串,以便显示 ' '。

实际行为:

  1. 获取数量(1) -> 1.0
  2. 获取数量(2) -> 2.0
  3. 获取数量(3) -> 3.3

期望的行为:

  1. 获取数量(1) -> 1.0
  2. 获取数量(2) -> 2.0
  3. GetQuantity(3) -> ' '

在情况 3 中,我显然可以 return -1.0 或其他东西,但这不是我需要的。

FUNCTION GetQuantity RETURNS DECIMAL(INPUT num  AS INTEGER):
    DEFINE VARIABLE quantity AS DECIMAL NO-UNDO FORMAT "->,>>>,>>9.9<<<<<<<<".

    quantity = 3.3. //initialization is neccessary as IRL my value is initialized

    IF num = 1 THEN DO:
        RETURN 1.0.
    END.

    ELSE IF num = 2 THEN DO:
        RETURN 2.0.
    END.

    RETURN quantity. //base case return ' '
END.

DISPLAY GetQuantity(3)

一种方法是return?在默认情况下并在您的输出例程中处理它。

作为?也是计算失败的结果(div by 0)这可能很危险。

另一种方法是编写一个 class,其中包含一个值 属性 和一个默认标志以及一个 ToString() 覆盖。

BLOCK-LEVEL ON ERROR UNDO, THROW.

USING Progress.Lang.*.

CLASS Test.SampleValueHolder: 

    DEFINE PUBLIC PROPERTY Value AS DECIMAL NO-UNDO
    GET.
    PRIVATE SET.

    DEFINE PUBLIC PROPERTY IsDefault AS LOGICAL NO-UNDO
    GET.
    PRIVATE SET.

    CONSTRUCTOR PUBLIC SampleValueHolder (pdeValue AS DECIMAL, 
                                          plDefault AS LOGICAL):

        ASSIGN THIS-OBJECT:Value     = pdeValue 
               THIS-OBJECT:IsDefault = plDefault .                                          

    END CONSTRUCTOR.

    METHOD PUBLIC OVERRIDE CHARACTER ToString ():

        IF THIS-OBJECT:IsDefault THEN 
            RETURN "" .
        ELSE 
            RETURN STRING (THIS-OBJECT:Value, "->,>>>,>>9.9<<<<<<<<") .

    END METHOD.

END CLASS.

现在您可以 RETURN NEW SampleValueHolder (1.0, FALSE) 或 RETURN NEW SampleValueHolder (?, TRUE) 到 Test.SampleValueHolder.

类型的变量中

并且每当您显示该值的 STRING () 时,您要么获得格式化值,要么在默认情况下获得 ""。

上述 Mike 的替代解决方案是将 getQuantity() 更改为 return 字符值,而不是当前的小数。当然,这可能会导致修复所有调用点的大量工作。我不知道它的使用范围。

此外,如果您所处的条件数量比您所显示的多,那么 CASE 将比许多 IF 语句更容易维护。像这样:

FUNCTION GetQuantity RETURNS CHARACTER(INPUT num  AS INTEGER):
    DEFINE VARIABLE quantity AS CHARACTER NO-UNDO INITIAL "3.3".

    CASE num:
        WHEN 1 THEN quantity = "1.0".
        WHEN 2 THEN quantity = "2.0".
        OTHERWISE quantity = "". 
    END CASE.

    RETURN STRING(quantity). 
END.

DISPLAY GetQuantity(3).