Classes são blueprints, não objetos
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
- Classes São Blueprints, Não Objetos:
class/end, e o que.newconstrói (você está aqui) - O Método initialize: o que
.newchama automaticamente, e por quê - Todo Objeto Guarda Seu Próprio Estado: variáveis de instância, uma cópia privada por objeto
- Métodos Leitores e Escritores, Escritos à Mão: expondo o estado de um objeto de propósito
- attr_reader, attr_writer, attr_accessor: gerando esses mesmos métodos em vez de digitá-los
- A Conveniência Que o ActiveRecord Escondia o Tempo Todo: conectando isso de volta ao
Article - 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.
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.