Classes
Para iniciar uma classe usamos a expressão class em seguida o nome da classe, finalizada com end. Seguindo os padrões de desenvolvimento para classes em Ruby, é aconselhado trabalhar com o nome das classes, com a técnica CamelCase (as iniciais em maiúsculo todas juntas, sem espaços), EX: MinhaClasse; e para o nome dos métodos use caixa baixa e separe-as com sublinhado "_", EX: nome_metodo.
- Exemplo de uma simples classe com construtor denominado initialize. Para instanciar a classe use o operador new juntamente com o nome da classe. Note que usei um Symbol, se você chegou até aqui, sabe para que serve ;):
class Ola
def initialize()
puts :oi
end
end
Ola.new
=>oi
- Criando e chamando um método:
class Ola
def fale_algo(diga)
puts diga
end
end
a = Ola.new
a.fale_algo('Barbaridade')
=>Barbaridade
- Uma classe mais completa simulando leitura e escrita de atributos. Existem três tipos controle de acesso, attr_reader (somente leitura), attr_write (somente escrita), attr_accessor (leitura e escrita):
class Pessoa
attr_reader :nome,:fone
attr_writer :fone
attr_accessor :email
def initialize(nome,fone,email)
@nome = nome
@fone = fone
@email = email
end
end
pes = Pessoa.new('Darlan Dieterich','7777-7777','d@d.com')
pes.fone = '0000-0000'
p pes.nome
p pes.fone
p pes.email
=>Darlan Dieterich
=>0000-0000
=>d@d.com
- Mudando estrutura da classe sem alterar a original. Note que é usado Struct para redefinir a estrutura da classe:
class Pessoa
attr_reader :nome,:fone
attr_writer :fone
attr_accessor :email
def initialize(nome,fone,email)
@nome = nome
@fone = fone
@email = email
end
end
Pessoa = Struct.new(:nome,:email,:fone)
pes = Pessoa.new('dieterich',77777777,'d@d.com')
p pes
=><struct Pessoa nome="dieterich", email=77777777, fone="d@d.com">
- Variaveis da classe. Em Ruby as variaveis da classe são definidas com @@ (dois arroba) juntamento com nome da classe, e também precisam ser inicializadas antes de seu uso:
class Pessoa
attr_reader :nome,:fone
attr_writer :fone
attr_accessor :email
@@contador = 0
def initialize(nome,fone,email)
@nome = nome
@fone = fone
@email = email
@@contador += 1
end
def instancias
@@contador
end
end
pes1 = Pessoa.new('Laura',77777777,'l@l.com')
pes2 = Pessoa.new('Darlan',77777777,'d@d.com')
pes3 = Pessoa.new('Jenifer',77777777,'j@j.com')
puts pes3.instancias
=>3
- Herança. Trabalha de forma hierárquica com objetivo de herdar as propriedades da classe antecessora, é usado '<' para definir a classe que sera herdada:
class Pessoa
attr_reader :nome,:fone
attr_writer :fone
attr_accessor :email
def initialize(nome,fone,email)
@nome = nome
@fone = fone
@email = email
end
end
class Fisica < Pessoa
def sou
"pessoa fisica"
end
end
f = Fisica.new('Darlan',987654321,'d@d.com')
puts f.nome
puts f.sou
=>"Darlan"
=>"pessoa fisica"
- Controle de acesso. Em Ruby public (público), protected (protegido), e private (privado), se aplicam somente a métodos. O public pode ser chamado a qualquer momento e lugar, o protected é usado na mesma ou na sua subclasse (acesso hierárquico), já o private somente pode ser chamado no objeto atual:
class Pai
def publico
puts 'sou o metodo publico'
end
def protegido
puts 'sou o metodo protegido'
end
def privado
puts 'sou o metodo privado'
end
public :publico
protected :protegido
private :privado
end
class Filho < Pai
def diga
puts protegido
end
end
a = Filho.new
a.publico
a.diga
a.privado
=>sou o metodo publico
=>sou o metodo protegido
=>private method `privado' called for #<Filho:0x26adf98>
Módulos
Módulos não são Classes, porém com funcionalidades semelhantes. Por exemplo, Modulo não possui instâncias e subclasses. Um módulo é iniciado com bloco module e finalizado com end. Os módulos são divididos em dois tipos, métodos de módulo e métodos de instância.
- Método de módulo. Não precisa ser incluído em outro objeto. Note que usei o comando self, ele é usado para fazer referência ao receiver atual.:
module Soma
def self.calcula(val1,val2)
val1+val2
end
end
puts Soma.calcula(16,50)
=>66
- Método de instância. É usada na instância de um objeto:
module Soma
def self.calcula(val1,val2)
val1+val2
end
end
class Calculadora
def self.soma(val1,val2)
Soma.calcula(val1,val2)
end
end
p x = Calculadora.soma(1,4)
=>5
Autor: Darlan Dieterich