Создание записи Ada с одним полем

Я определил тип:

type Foo is record
   bar : Positive;
end record;

Я хочу создать функцию, которая возвращает экземпляр записи:

function get_foo return Foo is
    return (1);
end get_foo;

Но Ада мне не позволяет, говоря, что "позиционный агрегат не может иметь один аргумент".
Тупо пытаясь, я добавил в запись еще одно тупое поле, и тогда return (1, DOESNT_MATTER); работает!

Как мне сказать Аде, что это не позиционный агрегат, а попытка создать запись?


ada
person ada hater    schedule 30.04.2010    source источник
comment
К вашему сведению: по моему опыту, большинство ненавистников Ады разочаровываются, потому что они пытаются кодировать какой-то другой язык на Аде. Как только вы научитесь писать на Аде, это будет очень хороший язык. Лучше, чем большинство. Тем не менее, он делает невероятно дрянной компилятор C.   -  person T.E.D.    schedule 30.04.2010
comment
Например, вам действительно нужно продумать свои типы. Если есть крайние случаи, когда вы попытаетесь поставить 0 в столбце выше, вы начнете сильно разочаровываться из-за постоянных constraint_error.   -  person T.E.D.    schedule 30.04.2010
comment
Как человек, который оптимистично отнесся к Аде, я был разочарован, потому что, в отличие от других языков, Ада чрезвычайно затрудняет изучение того, как это делается на Аде. :) Мне нравится идея Ады, но я нахожу ее реализацию запутанной и разочаровывающей. Я сочувствую адоненавистнику. :п   -  person weberc2    schedule 03.10.2012


Ответы (1)


Инициализацию позиционного агрегата нельзя использовать с записью, содержащей только один компонент, но это не означает, что вы не можете иметь запись с одним компонентом.

Значения типа записи указываются путем предоставления списка именованных полей. Правильный код для вашей функции get_foo должен быть следующим.

function get_foo return Foo is
    return (bar => 1);
end get_foo;

Вы также можете указать тип записи, используя выражение Foo'(bar => 1).

Использование списка именованных компонентов на практике лучше, чем позиционная инициализация. Вы можете забыть положение компонента, и оно не изменится, если вы добавите новое поле в свою запись.

person Lohrun    schedule 30.04.2010
comment
Спасибо! ты заставил меня ненавидеть Аду немного меньше! :) - person ada hater; 30.04.2010