Перейти к публикации
Форум - ComputerCraft
  • 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
упрощение примера

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


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

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

  • 1

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

 

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

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

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

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

 

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

  • Like 1

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


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

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

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

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

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×