Функционал Lua - простое недоразумение

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

property = {a=120, b=50, c=85}
operator = {has = {a, b}, coefficient = {a = 0.45}}
function Result(x) return operator.has.x * operator.coefficient.x end
print (Result(a))
error: attempt to perform arithmetic on field 'x' (a nil value)

Проблема в том, что функция пытается вычислить буквально "operator.has.x" вместо "operator.has.a".

Я могу вызвать функцию (x) return x.something end, но если я попробую function (x) something.x, я получаю сообщение об ошибке. Мне нужно улучшить свое понимание функций в Lua, но я не могу найти этого в руководствах.


person ridthyself    schedule 17.05.2013    source источник


Ответы (2)


Я не совсем уверен, что вы пытаетесь сделать, но вот рабочий код, основанный на вашем коде:

property = {a=120, b=50, c=85}
operator = {has = {a=2, b=3}, coefficient = {a = 0.45}}
function Result(x) return operator.has[x] * operator.coefficient[x] end
print (Result('a'))

Печатает '0,9'

person Michael Geary    schedule 17.05.2013
comment
Именно это я и пытаюсь сделать! Большое тебе спасибо. - person ridthyself; 17.05.2013
comment
Круто, рад, что помогли! - person Michael Geary; 17.05.2013

Это обычная проблема для новичков в языке. Захоронено в руководстве по Lua где-нибудь:

Для представления записей Lua использует имя поля в качестве индекса. Язык поддерживает это представление, предоставляя a.name в качестве синтаксического сахара для ["name"].

Это объясняет, почему ваш function Result(x) не работает. Если вы переведете синтаксический сахар, ваша функция станет:

function Result(x) 
  return operator.has['x'] * operator.coefficient['x']
end

Гири уже предложил решение этой проблемы, поэтому я не буду повторять его здесь.

person greatwolf    schedule 17.05.2013
comment
Ах, в этом есть смысл. Мне, вероятно, следует избегать использования каких-либо замещающих обозначений, пока я не пойму, как работают таблицы изнутри. - person ridthyself; 18.05.2013