2015-05-07 6 views
2

К примеру:Включите модуль, как он работает?

module Feature 
    def self.included(klass) 
    puts "#{klass} has included #{self}!" 
    end 
end 

class Container 
    include Feature 
end 

вы можете объяснить мне, как модуль может манипулировать Klass?

не может найти четкой документации.

Отношения.

+0

Что именно неясные вам? –

+0

как класс передается модулю? wath делает «включенный» метод? –

+1

Вероятно, [это] (http://stackoverflow.com/questions/151505/difference-between-a-class-and-a-module) ссылка может помочь. – Saubar

ответ

1

Это документация для ActiveSupport::Concern, они неплохо описывают это и «новый» подход к проблеме.

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

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

Так что здесь происходит, когда вы включаете Feature в Container прибыли метод included класса, который имеет доступ к самому классу (с помощью klass). Благодаря такому поведению мы можем, например, включать (или расширять) зависимые модули.

1

Я считаю, что это всего лишь метод. Это то, что я сделал в irb.

> require 'pry' 
> module A 
> def self.included klass 
>  puts "included" 
> end 
> end 
> class B 
> binding.pry 
> include A 
> end 

, когда он вступит в Поддеть, я просто вижу это

pry(B)> self.method(:include) 
=> #<Method: Class(Module)#include> 

, так что я думаю, что включают в себя способ, и угадайте включен метод вызывается, когда включают делается. Извините за это, я не вижу в этом ничего очевидного. Возможно, придется читать исходный код рубинового, потому что я прошу source_location, но получил ноль

pry(B)> self.method(:include).source_location 
=> nil 

Я думаю ActiveSupport :: Концерна используется для решения проблемы зависимостей