Многие классы являются неизменяемыми (например, Numeric
, Symbol
, ...), поэтому не имеют метода, позволяющего изменить их значение.
С другой стороны, любой Object
может иметьпеременные экземпляра и их можно изменять.
Существует простой способ делегировать поведение известному объекту (скажем, 42
) и впоследствии иметь возможность изменить другой объект, используя SimpleDelegator
.В приведенном ниже примере quacks_like_an_int
ведет себя как 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
Вы также можете использовать его для разработки класса, например:
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