Estrutura da Classe

As variáveis que começam com @ são atributos de instância, ou seja, é diferente para cada novo objeto. Já as que começam com @@ são atributos de classe, e é igual para todos objetos de uma classe.

O método initialize é um método construtor da classe. Ele cria uma instância com os argumentos que são passados a ele.

# classe.rb

def initialize(nome, endereco)
  @nome = nome
  @endereco = endereco

  @@quantidade_de_pessoas += 1
end

Ao fazermos @nome = nome, estamos atribuindo à variável de instância @nome o conteúdo da variável nome passada como argumento do método initialize. Assim como todos os outros atributos.

Na última linha, o código @@quantidade_de_pessoas += 1 incrementa em um a variável de classe que representa a quantidade total de pessoas criadas.

Com um objeto criado, como podemos acessar seus atributos? No exemplo acima, se tentarmos acessar o atributo nome do objeto aluno_do_pt não conseguiremos:

# classe.rb
puts aluno_do_pt.nome

Executando o arquivo via linha de comando:

$ ruby classe.rb
ruby.rb:17:in `<main>': undefined method `nome' for #<Pessoa:0x0055cd41226fc8> (NoMethodError)

Não há um método nome que possa ser usado num objeto da classe Pessoa. O Ruby é bem eficiente na resolução desse problema, há métodos que auxiliam o acesso a atributos:

attr_reader :atributo
# permite que o atributo seja lido

attr_writer :atributo
# permite que o atributo seja alterado

attr_accessor :atributo
# permite que o atributo seja lido e alterado

No nosso caso, queremos apenas ler o nome do aluno_do_pt. Logo, adicionaremos apenas o método attr_reader.

class Pessoa

  attr_reader :nome

  ...

end

...

puts aluno_do_pt.nome
$ ruby classe.rb
Gustavo