8.15. Zamrażanie obiektów w celu ich ochrony przed modyfikacją
Problem
Chcemy zabezpieczyć obiekt przed przyszłymi zmianami stanu.
Rozwiązanie
Należy zamrozić obiekt za pomocą metody Object#freeze
:
frozen_string = 'Brrrr!' frozen_string.freeze frozen_string.gsub('r', 'a') # => "Baaaa!" frozen_string.gsub!('r', 'a') # TypeError: can't modify frozen string
Dyskusja
Gdy obiekt zostaje zamrożony, jego zmienne instancyjne zostają permanentnie związane ze swymi bieżącymi wartościami. Nie są zamrażane same wartości — ich zmienne instancyjne nadal mogą być modyfikowane, w zakresie takim samym jak poprzednio:
sequences = [[1,2,3], [1,2,4], [1,4,9]].freeze sequences << [2,3,5] # TypeError: can't modify frozen array sequences[2] << 16 # ...
Get Ruby. Receptury now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.