Язык программирования Euphoria | страница 15



>27,

>185.5

>}


Чтобы обращаться к "полям" или элементам внутри структуры в хорошем стиле программирования, целесообразно создать набор констант для имён различных полей структуры. Тогда вашу программу будет легко читать. Для примера выше можно было бы иметь:

>constant NAME = 1

>constant FIRST_NAME = 1, LAST_NAME = 2


>constant SALARY = 2

>constant AGE = 3

>constant WEIGHT = 4


Тогда имя служащего можно получить как employee[NAME], а фамилию - как employee[NAME][LAST_NAME].

Массив структур:


>employees = {

>{{"John","Smith"}, 45000, 27, 185.5}, -- a[1]

>{{"Bill","Jones"}, 57000, 48, 177.2}, -- a[2]


>-- .... и так далее.

>}


employees[2][SALARY] будет 57000.

Встроенная функция length() выдаёт длину поданного в неё ряда. Следовательно, последний элемент ряда s равен:


>s[length(s)]


Имеется короткая форма записи, сокращение, для подобных операций:


>s[$]


Аналогично,


>s[length(s)-1]


может быть упрощено до:


>s[$-1]


Символ $ равен длине ряда. Сокращение $ можно использовать только внутри квадратных скобок. Если ряды вложенные, то есть:


>s[$ - t[$-1] + 1]


первый $ относится к длине s, а второй - к длине t (как вы, возможно, и ожидали). Ниже приведён пример, в котором $ может избавить вас от лишней работы, делая ваш код более ясным и, вероятно, даже более быстрым:


longname[$][$] -- последний элемент последнего элемента


Сравните с обычной формой записи той же самой операции:


longname[length(longname)][length(longname[length(longname)])]


Индексирование и функциональные побочные эффекты. Рассмотрим команду присваивания, когда в её левой части выполняется индексирование:


>lhs_var[lhs_expr1][lhs_expr2]... = rhs_expr


Здесь все вычисления выражений и любое индексирование производится слева направо. В выражении из правой части команды присваивания или в любом их левых выражений возможно использование вызова функции. Если при вызове функции возникает побочный эффект, приводящий к модификации lhs_var, то теряется определённость, появятся ли эти модификации в lhs_var, когда выполнение команды присваивания будет завершено. Чтобы быть вполне уверенным в том, что ваши ожидания исполнятся именно так, как вы этого хотите, следует выполнять вызов функции в отдельной команде, а не пытаться модифицировать lhs_var двумя различными путями в одной и той же команде. В тех случаях, когда в левой части команды присваивания индексирование отсутствует, вы можете всегда считать, что окончательное значение lhs_var будет равно значению rhs_expr, вне зависимости от любых побочных эффектов, которые могли бы изменить lhs_var.