将字符串输入与Enumerated类型进行比较

时间:2015-03-13 11:12:42

标签: ada

我希望对字符串和枚举进行比较。我写了一个我正在尝试的示例代码。由于String和Enumerated类型不同,我如何在Ada中正确执行此操作?

WITH Ada.Text_IO; USE Ada.Text_IO;

PROCEDURE ColorTest IS

   TYPE StopLightColor IS (red, yellow, green);

   response : String (1 .. 10);
   N : Integer;

BEGIN
   Put("What color do you see on the stoplight? ");
   Get_Line (response, N);
   IF response IN StopLightColor THEN
      Put_Line ("The stoplight is " & response(1..n));
   END IF;

END ColorTest;

3 个答案:

答案 0 :(得分:4)

首先为StopLightColor实例化Enumeration_IO

package Color_IO is new Ada.Text_IO.Enumeration_IO(StopLightColor);

然后您可以执行以下任一操作:

  • 使用Color_IO.Get读取值,抓住任何Data_Error

  • 使用Color_IO.Put获取Stringresponse进行比较。

除此之外,Stoplight_Color可能是枚举类型标识符的更一致的样式。

答案 1 :(得分:3)

另一种可能性:

Get_Line (response, N);
declare
    Color : StopLightColor;
begin
    Color := StopLightColor'Value(response(1..N));
    -- if you get here, the string is a valid color
    Put_Line ("The stoplight is " & response(1..N));
exception
    when Constraint_Error =>
        -- if you get here, the string is not a valid color (also could
        -- be raised if N is out of range, which it won't be here)
        null;
end;

答案 2 :(得分:3)

回答你的实际问题:

Ada不允许您直接比较不同类型的值,但幸运的是,有一种方法可以将枚举类型转换为字符串,该字符串始终有效。

对于任何枚举类型T,都存在一个函数:

function T'Image (Item : in T) return String;

返回传递给它的枚举对象的字符串表示。

使用它,您可以声明一个函数,该函数比较字符串和枚举类型:

function "=" (Left  : in String;
              Right : in Enumerated_Type) return Boolean is
begin
   return Left = Enumerated_Type'Image (Right);
end "=";

如果您想进行不区分大小写的比较,可以在比较它们之前将两个字符串映射到小写:

function "=" (Left  : in String;
              Right : in Enumerated_Type) return Boolean is
   use Ada.Characters.Handling;
begin
   return To_Lower (Left) = To_Lower (Enumerated_Type'Image (Right));
end "=";