O que é um módulo
Uma terceira palavra-chave, depois de class e def
Os dois cursos anteriores de OOP em Ruby usaram class/end para construir blueprints e def/end para construir métodos. O Ruby tem um terceiro container, module/end. Ele parece quase uma classe, mas faz outro trabalho:
module Greetable
def greeting
"Hi, I am a #{self.class}"
end
end
module Greetable ... end define um container com nome que guarda um método, greeting. Nada aqui cria um objeto, e o próprio Greetable nunca vai criar. É essa a diferença em relação a class com que esta aula começa.
Um módulo não pode ser instanciado
Greetable.class
# => Module, não Class
Greetable.new
# NoMethodError: undefined method 'new' for module Greetable
Greetable.class devolve Module, uma classe embutida diferente de Class. BankAccount.new funcionou durante todo o curso de classes porque BankAccount é uma Class, e .new é um método que toda Class oferece. Module não oferece .new, então a chamada levanta NoMethodError.
Um módulo guarda métodos, mas não tem onde rodá-los
Greetable#greeting é um método comum, def/end como nos cursos anteriores. Ele ainda não tem um objeto onde rodar. Sozinho, Greetable é um pedaço de comportamento sem dono: Ruby válido, mas sem utilidade por si só. As duas próximas aulas mostram as duas formas de ligar esse comportamento a uma classe, include e extend, e cada uma dá um resultado diferente.
O que este curso cobre
- O Que É Um Módulo:
module/end, e por que um módulo não pode ser instanciado (esta aula) - include Adiciona Métodos de Instância: misturando os métodos de um módulo em cada instância de uma classe
- extend Adiciona Métodos de Classe: misturando os métodos de um módulo na própria classe
- include vs extend, Mesmo Módulo: o mesmo módulo, das duas formas, lado a lado
- Módulos Como Namespaces: um segundo trabalho dos módulos, sem relação com o primeiro
- Um Mixin Real: Translatable: o módulo desta app, usado nos models dela
- Juntando Tudo: combinando os dois mecanismos num sistema pequeno
No fim, module, include e extend vão ser tão familiares quanto class, initialize e <.
Continue com a aula 2
include adiciona métodos de instância
Mostra como include insere o módulo nos ancestors da classe para que toda instância chame seus métodos.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.