Ruby include ou extend?

A resposta é os dois! Ou seja ambos tem um funcionamento semelhante mas o resultado final é diferente dai poder usar um ou outro dependendo do resultado final que queremos obter.

O include é chamado dentro de uma classe, basicamente o que ele faz é “pegar” nos métodos do módulo e adicionar esses métodos à classe como métodos de instância ou seja os métodos do módulo podem ser acedidos através dos objectos dessa classe. Por exemplo.

x = X.new
x.metodo_do_modulo(10)

Por sua vez o extend é também chamado dentro de uma classe, também ele “pega” nos métodos do módulos e adiciona esses métodos à classe mas neste caso como métodos de classe ou seja os métodos do módulos podem ser acedidos através da classe. Vejamos o exemplo

X.metodo_do_modulo("Hello")

É essa a diferença entre os dois, o include insere os métodos na instância da classe enquanto o extend insere na classe. Temos agora um pequeno exemplo na utilização dos dois.

module A
  def print_nome(nome)
    puts("Nome = " + nome)
  end
end

module B
  def print_hello()
    puts("Hello")
  end
end

class Classe
  include A
  extend B
end

a = Classe.new

a.print_nome("Magician")
Classe.print_hello()
a.print_hello()

output

Nome = Magician
Hello
22: undefined method `print_hello' for #<Classe:0xb7c3d428> (NoMethodError)

Como podemos ver o módulo A é adicionada com include como tá os seus métodos pode ser acedidos a partir do objecto, por outro lado o módulo B que é adicionado com extend os seus métodos apenas podem ser acedidos através da classe. Ao tentar aceder o métodos do módulo B como um método de instância é retornado um erro, dado que é um método de classe e não de instância.

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s