2010-12-08 45 views
11

techniques des paramètres de passage:Différence entre appel par nom et Call-By-Reference

D'après ce que je peux rassembler sur ces deux techniques.

appel par référence:

L'emplacement d'adresse de la variable est passée dans la fonction, donc dans le cadre local de la fonction, toute modification de la valeur de la variable locale va changer la valeur de l'original variable, puisqu'ils pointent vers le même endroit.

appeler par son nom:

La variable réelle est passée dans la fonction. Toute modification de la valeur de la variable dans la portée locale de la fonction sera également répercutée à l'extérieur de la fonction.

Il me semble que ces deux techniques de passage de paramètres accomplissent la même chose? Les deux agissent sur le contenu des variables d'origine. Est-ce que j'ai mal mes définitions? Est-ce que je pense à cela de la mauvaise façon?

Répondre

14

L'appel par le nom est légèrement différent de ce que vous décrivez. Dans le code pseudo, imaginez:

function foo(index, value-increment) 
    sum = 0 
    loop index = 1 to 3 
     sum = sum + value-increment 
    return sum 

x = 3 
foo(x, 1/x) 

Si notre appel est foo par référence, le second argument, 1/x, est évaluée une seule fois nous donnant effectivement: 1/3 + 1/3 + 1/3. C'est une évaluation stricte - chaque argument est entièrement évalué avant que la fonction soit appliquée.

Si nous appelons par nom, 1/x n'est pas strictement évalué. Au lieu de cela, il est évalué dans la boucle comme il est nécessaire. Effectivement, la boucle devient:

loop x = 1 to 3 
    sum = sum + 1/x 

ou 1/1 + 1/2 + 1/3.

Jetez un oeil à thunks, bien que les thunks ne signifient pas toujours call-by-name. Haskell a l'idée de thunks mais utilise call-by-need1/x ne serait pas évalué jusqu'à ce que ce soit nécessaire mais ensuite ne serait évalué qu'une seule fois (sans compter que Haskell n'aurait pas de variable de boucle mutable).

Autres ressources:

+0

Ceci est de loin la meilleure réponse à cette question (similaire) question que je suis venu à travers. –