Ir para conteúdo principal
Lucas Caton

Introdução à OO (Orientação a Objetos) usando Ruby

Fundamentos e prática

Lucas Caton

Lucas Caton

@lucascaton
Olá, meu caros!
As aulas que você está prestes a assistir eram parte de um curso pago. As inscrições do curso foram encerradas em agosto de 2023. Eu não tenho planos de abrir novas turmas, por isso decidi disponibilizar parte dele gratuitamente 🙂
Espero que goste. Sucesso em sua jornada! 👊

Códigos usados no vídeo:

metodos.rb

ruby
def numeros_impares(min = 0, max)
  (min..max).each do |numero|
    puts "O número #{numero} é ímpar" if numero.odd?
  end
end

def media(elementos)
  elementos.sum / elementos.size
end

def rolar_dado(faces)
  return 'número de faces precisa ser maior que 1' if faces <= 1

  rand(faces) + 1
end

numeros_impares(80, 90)
puts '---'
numeros_impares(12)

# puts media([9, 1, 2])
# puts media([10, 20])

# puts rolar_dado(1)
# puts rolar_dado(6)

classes.rb

ruby
# 1ª demonstração

class Cachorro
  def latir
    puts "au au"
  end
end

class Gato
  def miar
    puts "miau"
  end
end

cachorro = Cachorro.new
cachorro.latir

Gato.new.miar

#################################################

# 2ª demonstração

class Conta
end

class Banco
  def criar_nova_conta
    Conta.new
  end
end

banco = Banco.new
conta = banco.criar_nova_conta

escopo_de_variaveis.rb

ruby
class Pessoa
  def definir_nome(novo_nome)
    puts "O novo nome é #{novo_nome}"
    @nome = novo_nome
  end

  def exibir_informacoes
    puts "Nome: #{@nome}"
  end
end

pessoa = Pessoa.new
pessoa.definir_nome('Lucas')
pessoa.exibir_informacoes

pessoa2 = Pessoa.new
pessoa2.definir_nome("Daniel")
pessoa2.exibir_informacoes

metodo_construtor.rb

ruby
class Pessoa
  def initialize(nome, idade)
    @nome = nome
    @idade = idade
  end

  def exibir_informacoes
    puts "#{@nome} tem #{@idade} anos."
  end
end

pessoa = Pessoa.new('Joana', 45)
pessoa.exibir_informacoes

setters_and_getters.rb

ruby
class Produto
  attr_reader :fabricante      # somente leitura
  attr_writer :preco           # somente escrita
  attr_accessor :nome, :codigo # ambos leitura e escrita

  def initialize
    @fabricante = 'Apple'
    @codigo = 1234
  end
end

celular = Produto.new

# celular.fabricante = 'LG' # tentando chamar o setter (x)
# puts celular.fabricante   # tentando chamar o getter (✓)

# celular.preco = 1000 # tentando chamar o setter (✓)
# puts celular.preco   # tentando chamar o getter (x)

# celular.nome = 'iPhone' # tentando chamar o setter (✓)
# puts celular.nome       # tentando chamar o getter (✓)

# celular.codigo = 6789 # tentando chamar o setter (✓)
# puts celular.codigo   # tentando chamar o getter (✓)

metodo_privado.rb

ruby
class Sorteio
  def initialize(participantes)
    @participantes = participantes
  end

  def sortear
    return if @participantes.empty?

    sorteado = @participantes.sample
    puts "O participante sorteado foi: #{sorteado}!"

    remover_participante(sorteado)
  end

  private

  def remover_participante(participante)
    @participantes.delete(participante)
  end
end

participantes = ['Bruno', 'Gabriela', 'Leandro', 'Marcia']

sorteio = Sorteio.new(participantes)

sorteio.sortear
sorteio.sortear
sorteio.sortear
sorteio.sortear
sorteio.sortear

# Não é possível chamar o método privado abaixo:
# sorteio.remover_participante('qualquer coisa')

metodo_de_classe.rb

ruby
class Tempo
  def self.agora
    Time.now
  end

  # Podemos misturar métodos de classe e métodos de instância
  # na mesma classe, sem problemas:
  def alguma_coisa
    puts "funciona!"
  end
end


puts Tempo.agora


# tempo = Tempo.new
# tempo.alguma_coisa
# # ou...
Tempo.new.alguma_coisa