Ruby Language
Moduły
Szukaj…
Składnia
Deklaracja
module Name; any ruby expressions; end
Uwagi
Nazwy modułów w Rubim są stałymi, więc muszą zaczynać się od dużej litery.
module foo; end # Syntax error: class/module name must be CONSTANT
Prosty mixin z włączeniem
module SomeMixin
def foo
puts "foo!"
end
end
class Bar
include SomeMixin
def baz
puts "baz!"
end
end
b = Bar.new
b.baz # => "baz!"
b.foo # => "foo!"
# works thanks to the mixin
Teraz Bar
jest mieszanką własnych metod i metod SomeMixin
.
Zauważ, że użycie mixinu w klasie zależy od tego, jak zostanie dodany:
- słowo kluczowe
include
ocenia kod modułu w kontekście klasy (np. definicje metod będą metodami w instancjach klasy), -
extend
ocenia kod modułu w kontekście klasy singleton obiektu (metody są dostępne bezpośrednio na rozszerzonym obiekcie).
Moduł jako przestrzeń nazw
Moduły mogą zawierać inne moduły i klasy:
module Namespace
module Child
class Foo; end
end # module Child
# Foo can now be accessed as:
#
Child::Foo
end # module Namespace
# Foo must now be accessed as:
#
Namespace::Child::Foo
Prosty mixin z rozszerzeniem
Mixin to tylko moduł, który można dodać (wmieszać) do klasy. jednym ze sposobów jest skorzystanie z metody ext. extend
metoda dodaje metod wstawek jako metody klasy.
module SomeMixin
def foo
puts "foo!"
end
end
class Bar
extend SomeMixin
def baz
puts "baz!"
end
end
b = Bar.new
b.baz # => "baz!"
b.foo # NoMethodError, as the method was NOT added to the instance
Bar.foo # => "foo!"
# works only on the class itself
Moduły i skład klas
Za pomocą modułów możesz budować bardziej złożone klasy poprzez kompozycję . Dyrektywa include ModuleName
zawiera metody modułu w klasie.
module Foo
def foo_method
puts 'foo_method called!'
end
end
module Bar
def bar_method
puts 'bar_method called!'
end
end
class Baz
include Foo
include Bar
def baz_method
puts 'baz_method called!'
end
end
Baz
zawiera teraz metody z Foo
i Bar
oprócz własnych metod.
new_baz = Baz.new
new_baz.baz_method #=> 'baz_method called!'
new_baz.bar_method #=> 'bar_method called!'
new_baz.foo_method #=> 'foo_method called!'
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow