Люди дали некоторые хорошие примеры здесь, но вы можете создать и модули используют следующим образом, а также (Mixins)
Модуль быть включены
#instance_methods.rb
module MyInstanceMethods
def foo
puts 'instance method foo called'
end
end
модуль будет extended
#class_methods.rb
module MyClassMethods
def bar
puts 'class method bar called'
end
end
Включены методы модуля действуют, как будто они являются методы экземпляра класса, в котором модуль включен
require 'instance_methods.rb'
class MyClass
include MyInstanceMethods
end
my_obj = MyClass.new
my_obj.foo #prints instance method foo called
MyClass.foo #Results into error as method is an instance method, _not_ a class method.
Расширенные методы модуля действуют, как будто они являются методами класса из класса, в котором модуль включен
require 'class_methods.rb'
class MyClass
extend MyClassMethods
end
my_obj = MyClass.new
my_obj.bar #Results into error as method is a class method, _not_ an instance method.
MyClass.bar #prints class method bar called
Вы даже можете расширить модуль только для определенного объекта класса.Для этой цели вместо расширения модуля внутри класса, вы делаете что-то вроде
my_obj.extend MyClassMethods
Таким образом, только my_object
будет иметь доступ к MyClassMethods
методов модуля, а не другие экземпляры класса, к которому принадлежит my_object. Модули очень мощные. Вы можете узнать руду о них, используя core API documentation
Прошу прощения, если в коде есть какие-то глупые ошибки, я не пробовал, но надеюсь, что у вас есть идея.
Возможно, вы захотите использовать «def self.random», чтобы избежать проблем при изменении имени вашего модуля. Это обычная рубиновая практика. – molf