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