Nesta aula iremos aprender a renomear ou duplicar métodos de forma dinâmica utilizando o comando alias_method.

Metaprogramming - Alias para métodos e atributos


Hoje falaremos sobre:

  • super
  • alias_method
  • define_method
  • module
  • send

Aula Prática

Começaremos com o arquivo aula.rb onde criaremos a classe pai abaixo.

        
          require 'byebug'
      
          class Danilo
            def ola
              "olha original"
            end
          end
        
      

Polimorfismo

        
          class Danilo2 < Danilo
            def ola
              # "teste danilo para mostrar outras coisas "
              # se não utilizar o super aqui, perde a referencia do original
              "olha sobrescrito - " + super
            end
          end
          danilo2 = Danilo2.new
          debugger
          puts danilo2.ola # perco a referencia do 1
        
      

Arquivo final:

        
          require 'byebug'
      
          class Danilo
            def ola
              "olha original"
            end
          end
          ######################### Sobresquevendo e perdendo super #########################
          # class Danilo2 < Danilo
          #   def ola
          #     # "teste danilo para mostrar outras coisas " # se não utilizar o super aqui, perdi a referencia do original
          #     "olha sobrescrito - " + super
          #   end
          # end
          # danilo2 = Danilo2.new
          # debugger
          # puts danilo2.ola # perco a referencia do 1
          ######################### Com alias #########################
          # class Danilo2 < Danilo
          #   alias_method :ola_original, :ola
      
          #   def ola
          #     "olha sobrescrito"
          #   end
          #   def todos
          #     ola_original + ' ---- ' + ola
          #     # send("ola_original") + ' ---- ' + ola # mais dinamico ainda
          #   end
          # end
          # danilo2 = Danilo2.new
          # debugger
          # puts danilo2.ola
          # puts danilo2.todos
          ######################### Com modulo #########################
          # module ModuloOverwite
          #   def metodo(nome)
          #     original_metodo_nome = "#{nome.to_s}_original"
          #     alias_method original_metodo_nome, nome
          #     define_method(nome) do
          #       "teste danilo para mostrar outras coisas, agora dentro do modulo"
          #     end
          #     # parece que rola mais não rola
          #     # def todos
          #     #   send(original_metodo_nome) + ' ---- ' + send(nome)
          #     # end
          #     # parece que rola mais não rola
          #     # self.class_eval do
          #     #   def todos
          #     #     send(original_metodo_nome) + ' ---- ' + send(nome)
          #     #   end
          #     # end
          #     define_method("todos") do
          #       send(original_metodo_nome) + ' ---- ' + send(nome)
          #     end
          #   end
          # end
          # class Danilo2 < Danilo
          #   extend ModuloOverwite
          #   metodo :ola
          # end
          # danilo2 = Danilo2.new
          # debugger
          # puts danilo2.ola
          # puts danilo2.todos
          ######################## Com modulo passando bloco callback #########################
          module ModuloOverwite
            def metodo(nome, &bloco)
              original_metodo_nome = "original_#{nome.to_s}"
              alias_method original_metodo_nome, nome
              define_method(nome, &bloco)
              define_method("todos") do
                send(original_metodo_nome) + ' ---- ' + send(nome)
              end
            end
          end
          class Danilo2 < Danilo
            extend ModuloOverwite
            metodo :ola do
              "teste danilo para mostrar outras coisas, agora dentro do modulo, agora com o bloco customizado"
            end
          end
          danilo2 = Danilo2.new
          debugger
          puts danilo2.ola
          puts danilo2.todos
          x = ""
        
      




Próximas Aulas


Metaprogramming - Hooks

Nesta aula iremos aprender os conceitos de hooks, veremos como utiliza...

Metaprogramming - Missings

Nesta aula iremos aprender a utilizar os comandos const_missing e meth...

Instalando Rails

Nesta aula iremos aprender a instalar e configurar o Rails que é um do...

Rails Generators

Nesta aula iremos aprender um pouco sobre os generators do Rails, util...

Rails - Routes

Nessa aula iremos iniciar uma aplicação web do zero, agora passo a pas...

Rails - Partials

Nesta aula iremos aprender como dividir o conteúdo de nossos templates...

Rails - Migrations

Nesta aula iremos aprender a diferença de fazer um modelo de forma man...

Rails - Forms

Nesta aula iremos aprender como fazer um CRUD de forma manual no Rails...



Danilo

Arquiteto de software, analista, programador, professor. Danilo criou o projeto torne-se um programador, para passar o seu conhecimento para a nova geração. Com o intuito de ser um bom pai, Danilo trabalha muito motivado para garantir o futuro de sua filha.

ELEVE SEUS GANHOS E POTENCIALIZE SUA PERFORMANCE

Receba nossa Ebook de LÓGICA DE PROGRAMAÇÃO

© Didox Business & Technology - CNPJ: 12.127.195/0001-14