Metaprogramming with ruby, methods with SELF

1

Good evening ... I come from other languages somewhat different to Ruby, like C / C ++, JAVA ... And I missed a little while trying to understand the difference of the following methods:

Class teste 
     def novo
       "1"
     end
     def self.testenovo
     "2"
     end
end

I would like to know the difference between the two methods ... I've been researching and seen that self is a method of the class and the "new" is an instance method ... this applies where? at run time just right? because by doing this and declaring an instantiated variable of the test class, it will have both methods, correct? So where does this kind of statement apply? Thanks!

    
asked by anonymous 13.06.2017 / 04:26

1 answer

0

Let's say you're writing a car show, and knowing that we're in 2017, just two years to fly cars .

Your program would look something like this:

class Carro
  @@voa = false # carros não podem voar ainda

  def self.voa(v) # nosso setter pra quando carros puderem voar
    @@voa = v
  end

  def initialize(marca)
    @marca = marca
  end

  def explica
    if @@voa
      print 'eu sou um ' + @marca.to_s + ' e eu posso voar!'
    else
      print 'eu sou um ' + @marca.to_s + ' e eu nao posso voar ainda! :('
    end
  end
end
  

def self.voa(v) , allows us to modify the variable @@voa , which is a variable of classe , then applies to all instances.

Let's create some cars:

carros = []
carros << Carro.new('chevrolet')
carros << Carro.new('ford')
carros << Carro.new('volkswagen')
carros << Carro.new('fiat')

And we call the explica method of each of them:

carros.each { |c| puts c.explica }

Output:

eu sou um chevrolet e eu nao posso voar ainda! :(
eu sou um ford e eu nao posso voar ainda! :(
eu sou um volkswagen e eu nao posso voar ainda! :(

Now when we get to 2019, we can simply call:

Carro.voa(true) # chama pela classe!

All our cars become spinners , uhul!

eu sou um chevrolet e eu posso voar!
eu sou um ford e eu posso voar!
eu sou um volkswagen e eu posso voar!
eu sou um fiat e eu posso voar!

See working at repl.it .

A Better Example

As we are talking about a método de classe , you can use it to save all instances created in the class itself:

class Pessoa
  # variável de classe, onde guardaremos nossas instâncias
  @@pessoas = Array.new
  attr_accessor :nome

  def self.lista_pessoas
    @@pessoas
  end

  def initialize(nome)
    @nome = nome
    # ao instanciar, já guardamos no array
    @@pessoas << self
  end
end

# criando algumas pessoas
pessoa_1 = Pessoa.new('Ana')
pessoa_2 = Pessoa.new('Julia')
pessoa_3 = Pessoa.new('Tatiana')

# e listando todas, à partir do método de classe
Pessoa.lista_pessoas.each { |p| puts p.nome }

See working at repl.it .

Example taken from here.

    
14.06.2017 / 03:21