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.