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ściich 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.