Classes são blueprints, não objetos

Prévia grátis 3 min de leitura

Uma definição, vários objetos

O curso "Variáveis e atribuição" construiu uma pequena classe BankAccount para explicar variável local versus variável de instância, e usou ela sem nunca explicar o que class e .new fazem. Este curso fecha essa lacuna.

class BankAccount
  def initialize(starting_balance)
    @balance = starting_balance
  end

  def balance
    @balance
  end
end

account1 = BankAccount.new(100)
account2 = BankAccount.new(500)

class BankAccount ... end não cria uma conta. Ele define o que uma conta é: um blueprint descrevendo o que todo BankAccount vai ter e conseguir fazer. BankAccount.new(100) é a linha que constrói uma, um objeto real na memória, seguindo esse blueprint. Chamar .new uma segunda vez com outro número constrói um segundo objeto, completamente separado, account2, a partir do mesmo blueprint.

Verificado: dois objetos, duas identidades

account1.equal?(account2)
# => false, dois objetos distintos, mesmo vindos da mesma classe

account1.class
# => BankAccount

BankAccount.class
# => Class

account1 e account2 não são o mesmo objeto só por terem vindo da mesma classe, .equal? (identidade real de objeto, não só "parece igual") confirma isso diretamente. E há uma distinção pequena, mas importante, para notar aqui: account1.class é BankAccount, mas BankAccount.class é Class. Uma classe é ela mesma um objeto, uma instância da classe embutida Class do Ruby, cujo trabalho inteiro é produzir outros objetos quando .new é chamado nela.

Um blueprint que você já vinha lendo

O exemplo padrão deste arco, Article, usado desde o primeiro curso de Rails Core como um model ActiveRecord hipotético (não existe uma tabela articles ou uma classe Article de verdade nesta app; é um exemplo didático reaproveitado, não os models namespaced e mais complexos desta app), sempre teve essa cara:

class Article < ApplicationRecord
end

Essa é a mesma sintaxe class ... end, numa classe que já foi chamada, lida, e raciocinada por vários cursos, Article.new(title: "Hello Rails") no curso "Console Rails (IRB)" sendo um exemplo direto. Nada nessa sintaxe jamais foi mágica específica do Rails, é o mecanismo Ruby puro que este curso agora abre. A parte < ApplicationRecord é outra peça, herança, guardada para o próximo curso. Este aqui fica focado na classe em si: o que tem dentro dela, e o que .new faz com ela.

O que este curso cobre

  1. Classes São Blueprints, Não Objetos: class/end, e o que .new constrói (você está aqui)
  2. O Método initialize: o que .new chama automaticamente, e por quê
  3. Todo Objeto Guarda Seu Próprio Estado: variáveis de instância, uma cópia privada por objeto
  4. Métodos Leitores e Escritores, Escritos à Mão: expondo o estado de um objeto de propósito
  5. attr_reader, attr_writer, attr_accessor: gerando esses mesmos métodos em vez de digitá-los
  6. A Conveniência Que o ActiveRecord Escondia o Tempo Todo: conectando isso de volta ao Article
  7. Juntando Tudo: escrevendo uma classe completa do zero, e apontando para herança em seguida

Ao final, class Article < ApplicationRecord vai se ler como Ruby comum com uma palavra ainda não explicada, e é aí que o próximo curso começa.

Aula 1 de 7 · grátis

Continue com a aula 2

O método initialize

.new chama initialize sozinho com seus argumentos, que funcionam como parâmetros comuns, com valores padrão e ArgumentError.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...