2015-03-13 155 views
1

我在查找字符串与枚举的比较。我写了一个我正在尝试的示例代码。由于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; 
+0

一个相关的例子进行了审查[这里](http://stackoverflow.com/a/43152826/230513)。 – trashgod 2017-04-01 10:59:22

回答

4

首先实例Enumeration_IOStopLightColor

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

然后,你可以做以下任一操作:

  • 使用Color_IO.Get阅读的价值,捕捉任何Data_Error

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

另外,Stoplight_Color对于枚举类型的标识符可能是更一致的样式。

+0

工程就像一个魅力!感谢您及时的回复。 – user2297683 2015-03-13 13:36:06

+0

你得到一个upvote! – 2015-03-14 15:13:51

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; 
+0

你得到一个upvote! – 2015-03-14 15:14:06

3

回答您的实际问题:

阿达不允许直接比较不同类型的值,但幸运的是枚举类型转换为一种方法字符串,它始终有效。

对于任何枚举类型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 "="; 
+0

你会得到赞! – 2015-03-14 15:13:59

+0

在原始问题中,他想查看一个字符串是否与任何枚举文字相匹配。使用''Image'可以在循环中工作:'如果响应(1..N)= Enum then'...使用本答案中定义的函数'“=”,则Enumerated_Type循环中的Enum。 – ajb 2015-03-14 21:49:08