include ModuleName
ajoute les méthodes du module, comme par exemple méthodes de la classe, y compris.
Donc, si vous écrivez
class MyClass
include MyModule
end
alors my_method
devient une méthode d'instance sur MyClass
par exemple
m = MyClass.new
m.my_method # => "hello"
Lorsque vous ajoutez le module dans la classe singleton les méthodes sont encore ajoutées en tant que méthodes d'instance, mais à l'instance de la classe Class
pour votre classe. Par conséquent, ils apparaissent en tant que méthodes de classe sur MyClass
.
EDIT (Jörg W Mittag): Cependant, vous ne devriez jamais faire cela, puisque including
dans la classe singleton est le même que extending
l'objet original, qui est préféré. Donc, ceci:
class MyClass
class << self
include MyModule
end
end
est la même que celle-ci:
class MyClass
extend MyModule
end
Vous devriez toujours utiliser cette dernière forme.
Plus généralement, ceci:
foo = Object.new
class << foo
include MyModule
end
est la même que celle-ci:
foo = Object.new
foo.extend MyModule
EDIT (MAL): Si vous voulez vous faire méthode à la fois comme une méthode d'instance et une méthode, vous pouvez simplement définir votre méthode comme ci-dessus, et soit extend self
ce qui rendra toutes les méthodes d'instance accessibles à l'objet module lui-même, ou bien utiliser module_function :my_method
.
J'ai pris la liberté d'éditer la question pour utiliser le terme 'singleton class' car c'est le nom officiel. En effet, Ruby 1.9.2 introduit 'Object # singleton_class' –