Sto imparando Ruby e ho appena trovato un comportamento interessante quando si utilizza il metodo Object#freeze
con le variabili.Le variabili di congelamento in Ruby non funzionano
Dopo aver bloccato una variabile (sia Fixnum
o Array
), sono ancora in grado di modificarla! È strano, dal momento che per quanto mi riguarda questo non dovrebbe accadere e dovrebbe essere sollevato il numero TypeError
.
Ecco il mio codice:
test = 666
var = 90
#ok
var += 5
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var = test
puts "var = #{var}"
Lo stesso vale per array:
test = [666]
var = [90]
#ok
var += [5]
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var = test
puts "var = #{var}"
Ma quando provo a spingere qualcosa nella matrice dopo il congelamento, si solleva un arror, come previsto:
test = [666]
var = [90]
#ok
var += [5]
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var << test
puts "var = #{var}"
Qualcuno può spiegarmi questo problema? Sembra strano.
Edit Sto usando Windows Xp + Rubino 1.9.3-P429
curioso - perché 'test' =' 666': P – sircapsalot
Questo non è ciò che fa il congelamento; funziona esattamente come previsto. Non è possibile congelare valori immutabili come numeri letterali e sicuramente non è possibile "congelare" le variabili in modo che non possano essere impostate su nuovi valori. Si bloccano solo oggetti. – meagar
@meagar: è possibile bloccare i valori immutabili. È semplicemente inutile perché non possono essere comunque modificati. Ma '5.freeze' funziona ... nel senso che' 5.frozen? 'Restituisce' true'. –