2017-05-13 3 views
1

Der erste Satz von Code funktioniertAnfänger versuchen, herauszufinden, warum 2 sehr ähnlich Sets of Code haben sehr unterschiedliche Ergebnisse

https://repl.it/Br7w/1069

def scramble_string(string, positions) 
    scrambled="" 
    idx=0 
    while idx<string.length 
    scrambled+=string[positions[idx]] 
    idx+=1 
    end 
    puts scrambled 
    return scrambled 
end 

Es ergeben sich folgende Ein-/Ausgänge:

scramble_string ("ABCD", [3, 1, 2, 0]) == "dbca"

scramble_string ("Markov", [5, 3, 1, 4, 2, 0] Es ergeben sich folgende Ein-/Ausgänge) == "vkaorm"

Auf der anderen Seite, diese zweite Satz nicht

https://repl.it/Br7w/1072

def scramble_string(string, positions) 
    scrambled=string 
    idx=0 
    while idx<string.length 
    scrambled[idx]=string[positions[idx]] 
    idx+=1 
    end 
    puts scrambled 
    return scrambled 
end 

funktioniert:

scramble_string ("abcd", [3, 1, 2, 0]) == "dbcd"

scr amble_string ("markov", [5, 3, 1, 4, 2, 0]) == "vkkokv"

Bitte helfen Sie mir zu verstehen, warum der 2. Satz nicht funktioniert.

+0

Sind "dbca" und "vkaorm" die erwartete Ausgabe? –

Antwort

2

Weil in der zweiten scrambled_string Methode Sie Ihre scrambled Variable initialisieren, wie die Zeichenfolge als erster Parameter übergeben wird, nicht als eine leere Zeichenfolge.

def scramble_string(string, positions) 
    scrambled = '' 
    idx = 0 
    while idx < string.length 
    scrambled[idx] = string[positions[idx]] 
    idx += 1 
    end 
    scrambled 
end 

p scramble_string('abcd', [3, 1, 2, 0]) 
# => "dbca" 
p scramble_string('markov', [5, 3, 1, 4, 2, 0]) 
# => "vkaorm" 

Dies ist, was in beiden Fällen geschieht:

markov   markov 
v    v 
markov   varkov 
k    k 
markov   vkrkov 
a    k 
markov   vkkkov 
o    o 
markov   vkkoov 
r    k 
markov   vkkokv 
m    v 
"vkaorm"   "vkkokv" 
+0

Vielen Dank für die Antwort, aber ich bin immer noch verwirrt. Ich verstehe, dass verschlüsselt nicht leer ist, aber ich verstehe nicht, warum es nicht funktioniert, einfach jeden Wert der verschlüsselten Zeichenfolge ersetzen (die mit den Werten der Zeichenfolge stammt), anstatt in eine leere Zeichenfolge einzugeben . – Emilio

+1

Das Zuweisen von 'scrambled' als' string' ist wie wenn man die Buchstaben nimmt und sie ersetzt, aber wenn man Scramble als eine leere Zeichenfolge initialisiert, arbeitet man während der ganzen 'while' Schleife mit dem gleichen Wert. Siehe die bearbeitete Antwort. –

+1

@Emilio: Es "stammt nicht von den Werten der Zeichenfolge" string "ab, es ist * die Zeichenfolge" string ". Es gibt nur einen * String in Ihrem zweiten Snippet. Sie haben 'scrambled' zugewiesen, um dasselbe Objekt wie' string' zu sein. –

1

In Rubin, werden Zeichenfolgen durch Verweis zugeordnet. Das heißt, nach

scrambled=string 

Änderungen an scrambled auch string ändern wird.

Wenn Sie diese Zeile mit

scrambled=string.dup 

ersetzen, die scrambled seine eigene Kopie gibt, dann werden die Funktionen die gleiche Leistung geben.

+1

Genauer gesagt "Objektreferenz", die eine Form des unsichtbaren Zeigers ist. – tadman

Verwandte Themen