Wiele klas jest niezmiennych (np. Numeric
, Symbol
, ...), więc nie ma metody pozwalającej na zmianę ich wartości.
Z drugiej strony, każdy Object
może mieć zmienne instancji, a te mogą być modyfikowane.
Istnieje prosty sposób przekazania zachowania do znanego obiektu (na przykład 42
) i późniejszego zmienienia na inny obiekt przy użyciu SimpleDelegator
.W poniższym przykładzie quacks_like_an_int
zachowuje się jak Integer
:
require 'delegate'
quacks_like_an_int = SimpleDelegator.new(42)
quacks_like_an_int.round(-1) # => 40
quacks_like_an_int.__setobj__(666)
quacks_like_an_int.round(-1) # => 670
Można go używać do projektowania klasę też, na przykład:
require 'delegate'
class MutableInteger < SimpleDelegator
def plus_plus!
__setobj__(self + 1)
self
end
def positify!
__setobj__(0) if self < 0
self
end
end
i = MutableInteger.new(-42)
i.plus_plus! # => -41
i.positify! # => 0