Перейти к содержимому
  • 0
eu_tomat

Почему отличается порядок множественного присваивания?

Вопрос

Прошу знатоков Lua объяснить, почему на порядок множественного присваивания влияет объявление локальных переменных.

-- этот фрагмент выведет 2, 4
local a,a,b,b = 1,2,3,4
print(a,b)
-- а этот выведет 1, 3
a,a,b,b = 1,2,3,4
print(a,b)

Желающие понять, как можно прийти к таким безумным находкам, могут раскрыть спойлер:

Скрытый текст

 

Многим знакома конструкция вида


local _,_,_,_,a,_,_,b = computer.pullSignal()

Дальше начинается горе от ума.

_ - это тоже имя переменной, на создание которой тратятся ресурсы.

И мне показалось хорошей идей от этой переменной избавиться, заменив её на одну из уже используемых.


local a,a,a,a,a,b,b,b = computer.pullSignal()

Результат выполнения кода совпадает с предыдущим.

Зато этот код имеет иной результат:


a,a,a,a,a,b,b,b = computer.pullSignal()

Для достижения нужного эффекта всё же пришлось использовать дополнительную переменную. Только её использование гарантирует одинаковый результат независимо от наличия local в коде.

 

Но вопрос поведения Lua всё же остался.

 


 

Изменено пользователем eu_tomat
упрощение примера

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Это просто факт. Так реализован интерпретатор Луа.
Для локальных переменных присваивание идет слева направо, для глобальных - справа налево.

 

Как сказал сам Роберто Иерузалимски:

"Evaluation order and assignment order are both explicitly undefined."

То есть, порядок вычисления и присваивания спецификацией языка не определен, и может быть любым теоретически.

Поэтому полагаться на него нельзя. Он может меняться между различными реализациями интерпретатора.

 

Небольшое исследование на тему можно полистать тут: http://lua-users.org/lists/lua-l/2006-06/msg00376.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
58 минут назад, Totoro сказал:

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

Поэтому полагаться на него нельзя. Он может меняться между различными реализациями интерпретатора.

Полная неопределённость – это даже хуже, чем я мог подумать.

Ну, ладно. Нельзя, так нельзя. Не получилось хакерство в этом месте, получится в другом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...