2017-01-20 1 views
1

Disons que je fais unpack(4) ou unpack("hello world"). Y a-t-il des comportements inattendus à cela?Y at-il une raison de ne pas déballer des valeurs simples dans Lua

La raison est quelque chose comme ceci:

function a(bool) 
    if bool then 
    return {1, 2}, "foo" 
    else 
    return 1, "foo" 
    end 
end 

function b(x, z) 
end 

function b(x, y, z) 
end 

i, j = a(???) 
b(unpack(i), j) -- is this ok? 
+1

a-t-il traversé votre esprit à vous pourriez simplement exécuter le code et voir ce qui se passe au lieu de demander ce qui se passe? une meilleure façon d'apprendre – Piglet

+1

'b (décompresser (i), j)' est un mauvais exemple: le résultat de 'unpack (i)' sera ajusté à une valeur. –

+1

La façon la plus simple de retourner une table n'est-elle pas la meilleure? Donc, s'il y a une valeur à renvoyer, faites comme 'return {1}," foo "' – tonypdmtr

Répondre

2

unpack(4) provoquera une erreur

tentative d'obtenir la longueur d'une valeur numérique

unpack("hello world") retournera

néant néant néant néant néant néant néant néant néant néant néant

si ce n'est pas très utile aussi bien.

Le déballage est prévu pour le déballage des tables. Si vous souhaitez travailler avec une version récente de Lua vous remarquerez qu'il est maintenant table.unpack()

Autres problèmes avec votre code:

Lua ne prend pas en charge les fonctions de surcharge. Les fonctions sont des variables.

Vous écrivez:

function b(x, z) 
end 

function b(x, y, z) 
end 

La première définition est perdue une fois que la deuxième définition est traitée. Si vous utilisez une autre notation, elle sera plus claire. Votre code est équivalent à

b = function (x, z) 
end 

b = function (x, y, z) 
end 

et je pense que vous conviendrez que, après

b = 3 
b = 4 

b sera 4. Le même principe ...

+1

Bien que je vois le point que vous faites sur l'écrasement d'une définition de fonction, je ne suis pas d'accord avec 'Lua ne supporte pas les fonctions de surcharge' comme il permet le même effet, d'une manière différente. Par exemple, être autorisé à passer un nombre arbitraire ou un type d'argument fonctionne de la même manière. Dans votre exemple, 'la fonction b (x, y, z)' peut être amenée à agir comme 'fonction b (x, y)' quand 'z' est' nil'. Et, si une version supplémentaire d'une fonction doit être définie ultérieurement (c'est-à-dire séparément), vous pouvez toujours placer la fonction d'origine comme suit: 'local b = fonction (x, y, z) b (x , y) end' – tonypdmtr

+0

Corrections: 1) une fonction est une valeur, pas une variable. Une valeur de fonction, comme toute autre valeur, est "perdue" quand elle n'a pas de référence. 2) une définition de fonction est une expression qui produit une valeur de fonction. C'est un code qui ne peut jamais être perdu. –

+1

@tonypdmtr "surcharger" n'a de sens que lorsqu'il y a une phase de résolution de liaison (comme par le compilateur). Dans Lua, un nom ne fait référence qu'à une chose à n'importe qui une fois et à n'importe quel endroit. Chaque valeur de fonction peut être appelée avec n'importe quel nombre de paramètres à tout moment. Il traite ceux qu'il veut comme il veut et ignore le reste. –

2

Vous pouvez modifier les fonctions standard unpack à obtenir le comportement souhaité:

local old_unpack = table.unpack or unpack 

local function new_unpack(list, ...) 
    if type(list) ~= "table" then 
     list = {list} 
    end 
    return old_unpack(list, ...) 
end 

table.unpack = new_unpack 
unpack = new_unpack 

-- Usage: 
print(unpack(4)) 
print(unpack("hello world")) 
print(unpack(nil)) -- ops! nothing is printed!