Преамбула: я это не решение (pst уже писал: его нет), но, возможно, это может помочь в особых ситуациях.
Моей первой идеей было использование freeze
для получения решения:
a = "aa"
a.freeze
a << 'b' #can't modify frozen string (RuntimeError)
Теперь мы должны переопределить freeze
, и мы получим подсказку, когда переменная изменит значение:
module FreezeWarning
def freeze
puts "#{self}: I am changed"
end
end
a = "aa"
a.extend(FreezeWarning)
a.freeze
a << 'b' #aa: I am changed
Первая проблема: Нет способа получить имя переменной .
Вы можете решить эту проблему с помощью дополнительной переменной (Вы можете определить свою собственную идентификацию переменной, это не должно быть имя)
module FreezeWarning
def change_warning(name)
@varname = name
self.freeze
end
def freeze
puts "<#{@varname}> (#{self}): I am changed"
end
end
a = "aa"
a.extend(FreezeWarning)
a.change_warning('a')
a << 'b' #<a> (aa): I am changed
Но большая проблема: это работает только с изменениями значения, а не с новыми назначениями:
a = 5
a.freeze
a = 4
p a # -> 4
Так что это только очень ограниченное «решение».