Domanda

params[:hello] # => "Some params value"

hello = params[:hello]
hello.gsub!("whatever","")

params[:hello] # => ""

Non capisco, qualcuno può spiegare perché il params[:hello] viene modificato dal gsub!? Mi aspettavo la stringa hello da modificare, ma non l'hash params.

È stato utile?

Soluzione

hello e params[:hello] sono riferimenti alla stessa stringa. In rubino (come in Java e pitone tra gli altri) assegnazione non copia il valore, solo memorizza un altro riferimento allo stesso valore nel assigned-to variabile. Quindi, a meno di copiare in modo esplicito la stringa prima di modificarlo (usando dup) eventuali modifiche alla stringa interesserà tutti gli altri riferimenti alla stringa.

Altri suggerimenti

Ci sono due versioni di String#gsub disponibili

a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"

String#gsub! modifica la stringa originale e restituisce un riferimento ad esso. String#gsub non modifica l'originale e rende la sostituzione su una copia.

È un rubino linguaggio comune a metodi nomi che modificano l'oggetto con un !.

Se non si desidera che venga modificato, è necessario clonarlo, come:

hello = params[:hello].clone

Il modo in cui si sta facendo ora, avete un riferimento ad esso, non una copia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top