2014-08-12 2 views
0

Я пытаюсь включить/расширить модуль A в модуль B, который, в свою очередь, входит в класс C. Затем я хочу вызвать метод класса с именем cm of A, но я не знаю, как ,Доступ к методам класса модуля

module A 
    def self.included(klass) 
    klass.extend ClassMethods 
    end 

    module ClassMethods 
    def cm 
     puts "cm" 
    end 
    end 
end 

module B 
include A 
end 

class C 
extend B 
end 

c = C.new 
c.cm # -> does not work 
C.cm # -> does not work 

ответ

0

При включении модулей, вы делаете это:

module A 
    def self.included(klass) 
    klass.include ClassMethods 
    puts :included 
    end 

    module ClassMethods 
    def cm 
     puts :cm 
    end 
    end 
end 

module B 
include A 
end 

class C 
include B 
end 

c = C.new 
c.cm 

Аналогично при расширении классов, вы делаете это:

module X 
    def self.extended(klass) 
    klass.extend ClassMethods 
    end 

    module ClassMethods 
    def cm 
     puts :cm 
    end 
    end 
end 

module Y 
    def self.extended(klass) 
    klass.extend X 
    end 
end 

class Z 
extend Y 
end 

Z.cm 

См Include vs Extend in Ruby

1

Вы можете реально упростить этот синтаксис с дополнительным плагином:

https://github.com/henrik/augmentations

или драгоценный камень на его основе:

https://github.com/chemica/augmentations-gem

Использование:

class User 
    augment MyModule 
end 

с модулями как

module MyModule 
    augmentation do 


    def self.a_class_method 
     # … 
    end 

    def an_instance_method 
     # … 
    end 

    end 
end 

Плагин сам по себе является крошечным , всего несколько л ines кода.

Смежные вопросы