Язык программирования 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.