2016-03-31 10 views
3

Ich habe in Java gesagt, dass ich die ursprünglichen Parameter zu modifizieren sollten es vermeiden, wieSollen Parameter als Variablen in Lua verwendet werden?

public int doStuff(int begin, int end) { 
    /* loop or something */ 
    begin++; //bad 
    end--; //also bad 
    /* end loop */ 
    return 
} 

stattdessen ich so etwas wie

public int doStuff(int begin, int end) { 
    int myBegin = begin; //something like this 
    int myEnd = end; 
    /* stuff */ 
    return 
} 

tun sollte, ich habe dies in lua getan

function do_stuff(begin, last) 
    local my_begin = begin 
    local my_last = last 
    --stuff 
    my_begin = my_begin + 1 
    my_last = my_last - 1 
    --stuff 
end 

Aber ich frage mich, ob

function do_stuff(begin, last) 
    --stuff 
    begin = begin + 1 
    last = last - 1 
    --stuff 
end 

wird auch abgeraten, oder ist es nett und prägnant?

+2

Es ist nett und prägnant –

+1

... und ermutigt! – tonypdmtr

Antwort

6

Es gibt keine Regeln. Lass Geschmack, Klarheit und Notwendigkeit entscheiden.

Nevetheless eine gemeinsame Idiom ist, als Standardwerte für die Parameter bereitzustellen, in

function log(x,b) 
    b = b or 10 
    ... 
end 
2

Wenn Sie aufgefordert wurden, die Parameter von Funktionen nicht zu ändern, dann gab es wahrscheinlich eine Argumentation damit verbunden. Was auch immer diese Argumentation ist, würde sowohl für Lua als auch für Java gelten, da sie ähnliche Funktionsargumentsemantiken haben. Diese Gründe könnten eine oder mehrere sein (aber nicht beschränkt auf):

  • Wenn Sie einen Parameter ändern ... haben Sie ihn nicht mehr. Wenn Sie plötzlich den ursprünglichen Wert, den Sie erhalten haben, brauchen, ist es jetzt weg.

  • Verwirrung erzeugen, abhängig davon, wie die Parameter benannt sind. Das Wort "Anfang" deutet auf den Anfang von etwas hin. Wenn Sie es ändern, ist es nicht unbedingt der Anfang, sondern nur das aktuelle Element, auf dem Sie arbeiten.

  • Erstellen von potenziellen Fehlern, wenn es um Referenztypen (nicht-grundlegende Typen in Java, Tabellen und so in Lua). Wenn Sie ein Objekt ändern, ändern Sie es für alle. Während das Inkrementieren einer Ganzzahl nur Ihren lokalen Wert ändert. Also, wenn Sie häufig Parameter ändern, müssen Sie immer noch darüber nachdenken, welche Sie stoßen sollten und welche Sie nicht sein sollten.

  • Um es anders auszudrücken, wenn Sie dem Vorschlag in Java zustimmten, dann gilt es genauso für Lua. Wenn Sie mit dem Vorschlag in Java nicht einverstanden waren, haben Sie keinen Grund mehr, ihn unter Lua zu verfolgen.

    +0

    "Wenn du es änderst, ist es nicht unbedingt der Anfang": In der Tat! Ich weiche fast überall dem Konzept der Variables aus. Wenn Sie den Wert einer Variablen ändern, sollte ihr Name zu einer Lüge werden, wenn sie anfangs richtig benannt wurde. Für Parameter können jedoch sofortige, kurze, sinnvolle "Fix-Ups" wie die von @lhf vorgeschlagenen Standardeinstellungen nützlich sein. –

    1

    In Lua Funktionen, Fäden, Tabellen und Userdatentypen als Referenz übergeben werden. Wenn Sie also keinen von denen haben, arbeiten Sie trotzdem mit einer lokalen Kopie.

    So in Ihrem Beispiel:

    function do_stuff(begin, last) 
        --stuff 
        begin = begin + 1 
        last = last - 1 
        --stuff 
    end 
    

    begin und last sind lokale Nicht-Referenzgrößen in do_stuff ‚s Rahmen.

    Der einzige Grund, eine Kopie von ihnen zu erstellen, ist, dass Sie den Anfangswert für die spätere Verwendung speichern möchten. Zu diesem Zweck können Sie entweder eine Sicherungskopie des Anfangswertes erstellen oder eine Arbeitskopie erstellen. Was auch immer Sie bevorzugen.

    Nur stellen Sie sicher, dass Sie wissen, was durch Verweis und was nach Wert übergeben wird, so dass Sie vermeiden, Dinge zu ändern, die Sie nicht ändern möchten und umgekehrt.

    +0

    In historischen CS-Bedingungen werden alle Lua-Parameter "[nach Wert] (https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value) übergeben." Auf [SO] (http://stackoverflow.com/a/40523/2226988). Variablen können nicht als tatsächliche Argumente referenziert werden. (Syntaktisch sind tatsächliche Argumente immer Ausdrücke, unabhängig davon, wie einfach sie sind, und Ausdrücke können keinen neuen Wert erhalten.) –

    Verwandte Themen