2010-07-02 1 views
1

Я хотел бы инициализировать несколько 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, благодаря Иисусу


Ссылки

  1. http://www.linux-mag.com/cache/7432/1.html
  2. Does Ruby support var references like PHP?
  3. http://ruby.about.com/od/advancedruby/a/deepcopy.htm
+1

Вы понимаете, что ваш текущий a = b = c = AutoHash.new.few 3 сделает все переменные ссылкой на * тот же * экземпляр Hash? Если вы этого не хотите, для реализации оператора: =, вероятно, нужно вызвать clone(), и вы столкнетесь с обычным «я хочу глубокий клон»? проблемы. – Confusion

+0

Ops, извините. Я исправил это. Спасибо – Andrei

ответ

1

Где вы просите a := b := c := AutoHash.new.few 3 я думаю (не уверен, я понимаю ваше желание), что вы действительно хотите a,b,c=Autohash.new.few 3


Почему мало кто принимает переменную арг, когда вы только когда-либо использовать первый ?

Я также нахожу ваше создание возвращаемого значения, чтобы ввести в заблуждение, может быть, попробовать

def few(n=0) 
    Array.new(n) { AutoHash.new } 
end 

Помимо этого, похоже, few должен быть метод класса. a,b,c=AutoHash.few 3, который будет работать, если вы определили несколько на классе:

def AutoHash.few(n=0) 
    Array.new(n) { AutoHash.new } 
end 

If a,b,c=AutoHash.few 3 не то, что вы ищете, и вы действительно хотите реализовать свой собственный оператор, а затем проверить Взлом parse.y, который был разговором на RubyConf 2009.Вы можете посмотреть презентацию на http://rubyconf2009.confreaks.com/19-nov-2009-17-15-hacking-parsey-tatsuhiro-ujihisa.html, и вы можете видеть слайды на http://www.slideshare.net/ujihisa/hacking-parsey-rubyconf-2009

+0

Джошуа, спасибо за ответ. Переменные аргументы не нужны (просто плохая привычка). Я хочу использовать 'a: = b: = c = AutoHash.new' для инициализации (я, вероятно, изменил свой вопрос, когда вы печатали) – Andrei

+1

Я не понимаю, что должен делать оператор: =. Я читал новую версию вопроса несколько раз. Старая версия заставила меня подумать, что вам нужно поведение, которое «a, b, c» дает. Но теперь я не могу сказать. –

+0

В принципе, я хочу волшебного оператора для глубокого клонирования объектов. Так что предложение 'a: = b: = c = AutoHash.new' даст мне три не связанных хэша. До сих пор для этого я должен использовать метод 'few' для моего класса, что менее удобно. – Andrei