在隐式 class 运算符中防止值超出范围的适当方法是什么?
What's the appropriate way to prevent a value out of range in an implicit class operator?
what I'm working on 的一小部分引导我创建我自己的记录类型,它需要特定范围的 Double
。例如,在 HSV
颜色模型中,色调表示为从 0
到 360
的双精度值。我不能像定义整数那样定义这种类型:
type
THue = 0.0..360.0;
只是行不通。因此,我正在使用隐式 class 运算符进行记录,以与 Double
:
兼容
type
THue = record
private
FValue: Double;
public
class operator implicit(Value: THue): Double;
class operator implicit(Value: Double): THue;
end;
class operator THue.implicit(Value: THue): Double;
begin
Result:= Value.FValue;
end;
class operator THue.implicit(Value: Double): THue;
begin
//Need to restrict range to 0..360 here...
Result.FValue:= Value;
end;
但是,在分配 Double
--> THue
时,我不确定声明 0..360
范围的适当方法是什么。我可以引发异常,使用 Assert
语句,引发编译器错误,自动将值更改为在范围内,或者其他我没有考虑的事情。
我很自然地喜欢提出自己的异常类型,例如 EValueOutOfRange
,但编译器错误会更有意义。
在这种情况下,我应该如何防止分配超出范围的值?
编译器无法为您验证范围。您只需:
调整数值确保不超出范围:
class operator THue.implicit(Value: Double): THue;
begin
if Value < 0.0 then Value := 0.0
else if Value > 360.0 then Value := 360.0;
Result.FValue := Value;
end;
引发异常(这也适用于断言,可以关闭,所以不是最好的选择):
class operator THue.implicit(Value: Double): THue;
begin
if (Value < 0.0) or (Value > 360.0) then raise ...;
Result.FValue := Value;
end;
这些是你的选择。
what I'm working on 的一小部分引导我创建我自己的记录类型,它需要特定范围的 Double
。例如,在 HSV
颜色模型中,色调表示为从 0
到 360
的双精度值。我不能像定义整数那样定义这种类型:
type
THue = 0.0..360.0;
只是行不通。因此,我正在使用隐式 class 运算符进行记录,以与 Double
:
type
THue = record
private
FValue: Double;
public
class operator implicit(Value: THue): Double;
class operator implicit(Value: Double): THue;
end;
class operator THue.implicit(Value: THue): Double;
begin
Result:= Value.FValue;
end;
class operator THue.implicit(Value: Double): THue;
begin
//Need to restrict range to 0..360 here...
Result.FValue:= Value;
end;
但是,在分配 Double
--> THue
时,我不确定声明 0..360
范围的适当方法是什么。我可以引发异常,使用 Assert
语句,引发编译器错误,自动将值更改为在范围内,或者其他我没有考虑的事情。
我很自然地喜欢提出自己的异常类型,例如 EValueOutOfRange
,但编译器错误会更有意义。
在这种情况下,我应该如何防止分配超出范围的值?
编译器无法为您验证范围。您只需:
调整数值确保不超出范围:
class operator THue.implicit(Value: Double): THue; begin if Value < 0.0 then Value := 0.0 else if Value > 360.0 then Value := 360.0; Result.FValue := Value; end;
引发异常(这也适用于断言,可以关闭,所以不是最好的选择):
class operator THue.implicit(Value: Double): THue; begin if (Value < 0.0) or (Value > 360.0) then raise ...; Result.FValue := Value; end;
这些是你的选择。