2013-08-09 12 views
9

Der Zweck der folgenden Funktion besteht darin, eine Zeichenfolge zurückzugeben, die den Argumentwert zwischen zwei Sternen eingefügt hat.Was genau ist passiert, wenn man nicht "copy" verwendet, um mit einer Zeichenkette umzugehen?

Beim zweiten Aufruf der Funktion bleibt das Argument des ersten Aufrufs noch eingefügt. Ich weiß, die Antwort ist copy "**" zu verwenden. Meine Frage ist, ob es nicht die stars Variable zu "**" bei jedem Aufruf der Funktion neu zuweisen?

Antwort

6

Im Fall der Funktion erforderlich gibt es nur eine „**“ string Definition. Diese Definition wird von Rebol load Funktion nur einmal verwendet, da load nur einmal ausgeführt wird, um den Code in Rebol interne Form - einen Block zu übersetzen. Es ist richtig, dass die Zuweisung zweimal vorkommt, wenn Sie die Funktion zweimal aufrufen, aber die Zuweisung nichts erzeugt, sie bewirkt lediglich, dass sich die Variable wieder auf dieselbe Zeichenfolge bezieht.

In Ihrem Kommentar sollten Sie beachten, dass Sie tatsächlich zwei "**" String-Definitionen haben, die dazu führen, dass zwei Strings von load erstellt werden. Wenn Sie

code: [stars: "**" insert next stars something] 
something: "this" 
do code 
something: "that" 
do code 

verwenden, werden Sie feststellen, dass es nur einen String-Definition ist und während Sie keine Funktion haben das Verhalten ist das gleiche wie es war, als eine Funktion verwendet wurde.

+0

Ich denke, ich habe die Idee. In Rebol sind Funktionen nur Blöcke. Es unterscheidet sich ziemlich von den Funktionen in anderen Sprachen. Vielen Dank :) –

+0

Ein Einblick, warum Rebol sich so verhält: [Ist Rebol eine reine funktionale Sprache] (http://www.rebol.com/article/0206.html) – rgchris

2

Wenn Sie ein Set-Wort für eine Serie verwenden, ist das Standardverhalten, den Speicher für diese Serie nur einmal zuzuweisen. Dadurch können Sie das als statische Variable verwenden, die zwischen Funktionsaufrufen, wie Sie gefunden haben, bestehen bleibt.

Wenn Sie dieses Verhalten nicht möchten, müssen Sie die Serie explizit kopieren, um jedes Mal eine neue Serie zu erstellen.

Dies ist ein weiterer Weg, dies zu lokalen, wie die Sterne tun können, ist nicht

star-name: func [ name ][ 
    rejoin [ "*" name "*" ] 
] 
+0

Dann ist es das Merkmal der Funktion? Weil ich nur schreibe: "Sterne:" ** "nächste Sterne einfügen" diese "print Sterne Sterne:" ** "nächste Sterne einfügen", die "Sterne drucken", hätte das obige Problem nicht. –

+1

In diesem haben Sie jetzt zwei verschiedene Serien an zwei verschiedenen Speicheradressen. –