Classes
A definição de uma classe se inicia com o uso da palavra class,
e termina com a palavra end, da seguinte maneira:
class Classe end
Herança é expressa pelo símbolo de menor-que ('<') ao lado do
nome da classe, seguido da super-classe. Por exemplo:
class Humano < Mamifero end
Na definição de uma classe pode-se ter quaisquer expressões válidas, ou seja, comandos, novas definições de classes, métodos, módulos, etc..
class Teste
class Teste
puts "A classe Teste::Teste está sendo definida."
def oi
puts "oi"
end
end
end
O operador de escopo, ::, é usado para acessar membros internos
de uma classe, ou para acessar explicitamente uma constante externa a quaisquer
classes/módulos, prefixando a constante.
a = Teste::Teste.new a::oi # >> oi a.oi # >> oi puts FALSE == ::FALSE # >> true
A inicialização das instâncias de uma classe é feita pelo método
initialize (note o 'z'). Os métodos de nomes iniciados por
attr (attr, attr_accessor,
attr_reader, e attr_writer da classe
Module) servem para declarar atributos e seus
getters/setters automaticamente.
class Pessoa
attr "nome"
attr "idade"
def initialize(nome, idade)
@nome, @idade = nome, idade
end
end
p = Pessoa.new("Jeca", 33)
p.nome # >> Jeca
p.idade # >> 33
Definições de classes nunca estão fechadas. Ou seja, é possível fazer sua definição ao longo de várias partes do programa, da seguinte maneira:
class Teste
def oi
puts "oi"
end
end
class Teste # Continua a definição da classe
def tchau # Novo método
puts "tchau"
end
end
a = Teste.new
a.oi # >> oi
a.tchau # >> tchau
Porém, é possível chamar o método freeze de uma classe, e assim impedir sua alteração posterior.
class A end A.freeze class A def aie end end # >> TypeError: can't modify frozen class ...
Também é possível definir classes singleton, que são classes
específicas a um objeto, usando class << objeto .... A forma
para fazer isso é:
objeto = "abc"
class << objeto
def aie
"aie"
end
end
puts objeto.aie # >> aie
Outra forma, implícita, de criar uma classe singleton é definindo um método singleton, como é visto na seção "Métodos". Ambas as formas são equivalentes, porém pode ser mais conveniente usar uma ou outra, dependendo das circunstâncias.
É possível limitar a visibilidade de métodos e constantes, usando os métodos
public (acesso público), protected (acesso apenas a
objetos da classe e subclasses) e private (só podem ser chamados
sem receptor explícito). Chamados sem argumentos, alteram a visibilidade padrão.
Chamados com argumentos, alteram a visibilidade dos métodos e constantes
especificados. Porém, devido a natureza dinâmica de Ruby, isto apenas dá uma
certa formalidade à interface das classes.