2013-05-17 6 views
4

Je suis en train de développer une fonction qui effectue des calculs sur deux valeurs qui ont la même clé:fonctions Lua - simple malentendu

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) 

Le problème est que la fonction tente mathématiques sur littéralement " operator.has.x "au lieu de" operator.has.a ".

Je suis capable d'appeler une fonction (x) return x.something end, mais si j'essaie la fonction (x) quelque chose.x j'obtiens une erreur. J'ai besoin d'améliorer ma compréhension des fonctions de Lua, mais je ne peux pas le trouver dans les manuels.

Répondre

6

Je ne suis pas sûr de ce que vous essayez de faire, mais voici un code de travail qui est basé sur votre code:

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')) 

Prints « 0,9 »

+0

C'est ce que j'essaie de faire, précisément! Merci beaucoup. – ridthyself

+0

Cool, heureux que cela ait été utile! –

2

Ce point commun gotcha pour les nouveaux arrivants à la langue. Enterré dans le manuel Lua somewhere:

Pour représenter les enregistrements, Lua utilise le nom du champ comme index. Le langage prend en charge cette représentation en fournissant a.name comme syntaxe sucre pour un ["nom"].

Cela explique pourquoi votre function Result(x) est défaillant. Si vous traduisez le sucre syntaxique, votre fonction devient:

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

Geary déjà offert une solution à ce donc je ne reprendrai pas ici.

+0

Ah, c'est logique. Je devrais probablement éviter d'utiliser une notation de remplacement jusqu'à ce que je comprenne comment les tableaux fonctionnent sous le capot. – ridthyself