Return 未找到匹配项时的默认值
Return Default Value When No Match Found
我有一个函数 GetQuantity,它 return 是一个小数。在某些情况下,我不想 return 什么,即空字符串,以便显示 ' '。
实际行为:
- 获取数量(1) -> 1.0
- 获取数量(2) -> 2.0
- 获取数量(3) -> 3.3
期望的行为:
- 获取数量(1) -> 1.0
- 获取数量(2) -> 2.0
- 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).
我有一个函数 GetQuantity,它 return 是一个小数。在某些情况下,我不想 return 什么,即空字符串,以便显示 ' '。
实际行为:
- 获取数量(1) -> 1.0
- 获取数量(2) -> 2.0
- 获取数量(3) -> 3.3
期望的行为:
- 获取数量(1) -> 1.0
- 获取数量(2) -> 2.0
- 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).