Я хотел бы инициализировать несколько auto-vivifying hashes однострочным выражением. До сих пор я пришел к дополнительному методу для AutoHash
объекта:Множественная инициализация автоживущих хэшей с использованием нового оператора в Ruby
class AutoHash < Hash
...
def few(n=0)
Array.new(n) { AutoHash.new }
end
, который позволяет мне сделать следующее
a, b, c = AutoHash.new.few 3
Однако, я считаю, что можно сделать возможное следующее предложение, определив новый оператор :=
a := b := c = AutoHash.new
Не могли бы вы помочь мне осуществить это?
Должен ли я использовать superators?
require 'superators'
class AutoHash < Hash
...
superator ":=" do |operand|
if operand.kind_of? Hash
...
else
...
end
end
Update: Теперь я вижу, что оператор должен быть определен вне класса. Можно ли определить такой оператор клонирования объекта?
Update2 Более четкое определение метода few
, благодаря Иисусу
Ссылки
- http://www.linux-mag.com/cache/7432/1.html
- Does Ruby support var references like PHP?
- http://ruby.about.com/od/advancedruby/a/deepcopy.htm
Вы понимаете, что ваш текущий a = b = c = AutoHash.new.few 3 сделает все переменные ссылкой на * тот же * экземпляр Hash? Если вы этого не хотите, для реализации оператора: =, вероятно, нужно вызвать clone(), и вы столкнетесь с обычным «я хочу глубокий клон»? проблемы. – Confusion
Ops, извините. Я исправил это. Спасибо – Andrei