2015-12-30 2 views
2

Я хочу, чтобы динамически переписать метод Hash#[]=, вызвав метод f. Следующий код не работает, потому что определение класса не допускается внутри метода:Как перезаписать метод динамически

def f 
    class Hash 
    def []=(k, v) 
     ... 
    end 
    end 
end 

Обойти это положить class Hash в отдельном файле, а затем

def f 
    require 'my_hash.rb' 
end 

Интересно, если есть способ чтобы не добавлять отдельный файл.

ответ

5
def f 
    Hash.send(:define_method, :[]=) do |x, y| 
    ... 
    end 
end 
1

Вот еще один способ сделать это:

def f 
    Hash.class_eval do 
     def []=(k, v) 
      #... 
     end 
    end 
end 
Смежные вопросы