2015-03-13 5 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

ответ

4

Первый Instantiate Enumeration_IO для StopLightColor:

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

Затем вы можете сделать одно из следующих действий:

  • Color_IO.Get Используйте для чтения значения, ловя любую Data_Error.

  • Использовать Color_IO.Put для получения String для сравнения с response.

Как и в стороне, Stoplight_Color может быть более последовательным стилем для идентификатора перечислимого типа.

+0

Работает как очарование! Спасибо за быстрый ответ. – user2297683

+0

Вы получаете upvote! –

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! –

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

И вы получаете upvote! –

+0

В исходном вопросе он хотел посмотреть, соответствует ли строка любому из литералов перечисления. Использование '' Image' будет работать в цикле: 'для Enum in Enumerated_Type loop'', если ответ (1..N) = Enum then' ... с использованием функции '' = '', определенной в этом ответе. – ajb

Смежные вопросы