У меня есть класс, который упаковывает ячейки произвольных данных;своего рода фильтр.Клетки живут в хранилище данных бэкэнда.но это должно быть настолько прозрачно, насколько это возможно.
Написание простых средств доступа достаточно просто:
def foo
# fetch backend cell value and return it
end
def foo=(val)
# store val in backend cell
end
Часть, которую я нахожу хитрой, это методы перехвата и отслеживания, которые обычно влияют на данные, еслиэто не было завернуто.Например, если данные являются массивом, obj.foo << 17
добавит элемент в массив in situ .Я хочу сохранить это поведение для данных, хранящихся в бэкэнде (, то есть , obj.foo << 17
приводит к тому, что к сохраненному значению также добавляется элемент).Я подумал, что, возможно, method_missing
поможет:
def method_missing(meth, *args)
methsym = meth.to_sym
curval = self.get
lastval = curval.clone
opresult = curval.__send__(methsym, *args)
if (curval != lastval)
self.set(curval)
end
return opresult
end
, но в сочетании с аксессором считывателя управление операцией вышло за пределы моего понимания, потому что вещь, которую она возвращает, не сам.( Т.е. , если бэкэнд-данные - это массив, я возвращаю копию их, и эта копия модифицируется и никогда не отправляется обратно мне.)
Возможно ли это?Если так, как я могу это сделать?(Это, вероятно, до боли очевидно, и я просто скучаю по нему, потому что я устал - или, возможно, нет.: -)
Спасибо!
[отредактировано]
Другими словами ... #method_missing
позволяет подключиться к процессу вызова неизвестных методов.Я ищу способ подключиться к процессу вызова аналогичным образом, но для всех методов, известных и неизвестно.
Спасибо!