Ruby é uma Linguagem de programação interpretada, com Tipagem Dinâmica e Tipagem Forte, orientada a objetos e, com várias semelhanças com Perl, Python e SmallTalk.
Projetada tanto para a programação em grande escala quanto para
codificação rápida, tem um suporte a orientação a objetos simples e
prático. A linguagem foi criada pelo japonês Yukihiro Matsumoto, que aproveitou as melhores idéias das outras linguagens da época.
Esta linguagem possui vastos repositórios de bibliotecas
disponíveis em sites como Ruby Forge e Ruby Application Archive (RAA).
Existe, ainda, uma ferramenta bastante útil para instalação de
bibliotecas, chamada Ruby Gems. O projeto mais famoso desenvolvido em Ruby é o meta-framework Rails (Veja: Ruby on Rails).
HistóriaRuby se tornou reconhecida no meio especializado desde que Dave Thomas e Andrew Hunt, conhecidos como "Programadores Pragmáticos", adotou-a como uma de suas linguagens preferidas e acabou por escrever um dos mais completos livros sobre a linguagem, o Programming Ruby.
Com o advento desta publicação, a linguagem passou a contar com uma boa
fonte de iniciação e referência em inglês, aumentando consequentemente
o número de adeptos da linguagem no Ocidente.
Ultimamente, devido a grande exposição de um framework web feito em
Ruby, o Rails desenvolvido por David Heinemeier Hansson, a linguagem tem sido foco da mídia especializada justamente pela sua praticidade.
Esta mesma praticidade inclusive é um dos conceitos básicos da linguagem. É possível fazer algoritmos que resolvam seus problemas, não necessitando se preocupar com as limitações da linguagem ou do interpretador.
Como surgiu o nome "Ruby"O nome "Ruby", foi decidido durante uma sessão de bate-papo online
entre Matsumoto (Matz) e Keiju Ishitsuka em 24 de fevereiro de 1993,
antes que qualquer linha de código tinha sido escrita para a linguagem.
Inicialmente foram propostos dois nomes: "Coral" e "Ruby", sendo esse
último nome proposto escolhido mais tarde por Matz em um e-mail para
Ishitsuka.
CaracterísticasPara manter a praticidade, a linguagem possui algumas características interessantes:
- A sintaxe é enxuta, quase não havendo necessidade de colchetes e outros caracteres.
- Todas as variáveis são objetos, onde até os "tipos primitivos" (tais como inteiro, real, entre outros) são classes.
- Estão disponíveis diversos métodos de geração de código em tempo real, como os "attribute accessors".
- Através do Ruby Gems, é possível instalar e atualizar bibliotecas com uma linha de comando, de maneira similar ao APT do Debian Linux.
- Code blocks (blocos de código), ajudam o programador a
passar um trecho de instruções para um método. A idéia é semelhante aos
"callbacks" do Java, mas de uma forma extremamente simples e bem
implementada.
- Mixins, uma forma de emular a herança múltipla, sem cair nos seus problemas.
- Tipagem dinâmica, mas forte. Isso significa que todas as variáveis
devem ter um tipo (fazer parte de uma classe), mas a classe pode ser
alterada dinamicamente. Os "atalhos" citados acima, por exemplo, se
beneficiam da tipagem dinâmica para criar os métodos de
acesso/alteração das propriedades.
Ruby está disponível para diversas plataformas, como Microsoft Windows, .NET, Linux, Solaris e Mac OS X, além de também ser executável em cima da máquina virtual do Java (através do JRuby).
Orientada a objetosMuitos programadores consideram o Ruby uma linguagem de programação totalmente orientada a objetos (de maneira similar ao SmallTalk), porém devido a inexistência de conceitos padrões para especificação de linguagens OO, isto não pode ser provado.
Ruby não possui tipos primitivos, mas sim todos tipos são classes,
assim como todas variáveis são objetos. Como exemplo, conjunto de
caracteres é uma instância da classe
String, inteiro é da
Fixnum e matriz é
Array.
Um conceito interessante também é que a maioria dos operadores
binários e unários são, na realidade, métodos. Ou seja, podem ser
alterados da mesma forma que os operadores em C++. Exemplo:
- Código:
-
class MeuNumero < Fixnum
def +(numero)
42
end
end
numero = MeuNumero.new(1)
# Repare como um operador de soma é um método em ruby, ao contrário de outras linguagens
puts numero + 2 # 1+2 = 42 ??? Sim, sobrescrevemos o método de soma para retornar 42 sempre.
Attribute Readers e WritersUma das funcionalidades mais úteis do
Ruby são os
attribute accessors, que geram
getters e
setters em tempo de execução. Compare os seguintes códigos:
- Código:
-
class Pessoa
# Não utilizando Attribute Accessor
def nome
@nome
end
def nome=(valor)
@nome = valor
end
def nascimento
@nascimento
end
def nascimento=(valor)
@nascimento = valor
end
def cpf
@cpf
end
def cpf=(valor)
@cpf = valor
end
end
# Utilizando Attribute Accessor
class Pessoa
attr_accessor :nome, :nascimento, :cpf
end
Controle de acessoEm
Ruby, você pode deixar três tipos de acesso aos métodos:
métodos públicos, privados e protegidos. Os métodos públicos podem ser
acessados por qualquer classe e por qualquer objeto (instância). Os
métodos privados podem ser acessados somente por objetos de mesmo tipo
(mesma classe).
Métodos protegidos são métodos que podem ser acessados por qualquer
objeto dentro da mesma estrutura hierárquica da classe. Por exemplo,
uma classe
- Código:
-
Pessoa < SerHumano
pode acessar métodos protegidos de SerHumano. Mas, ao contrário da
maioria das linguagens orientadas a objeto, você especifica o controle
de acesso por "bloco", como nos exemplos abaixo:
- Código:
-
class Pessoa
attr :nome, :nascimento, :cpf
def metodoPublico
end
protected
def metodoProtegido
end
def outroMetodoProtegido
end
private
def metodoPrivado
end
def outroMetodoPrivado
end
public
def deNovoMetodoPublico
end
end
Você pode ainda declarar todos seus métodos sem definir a visibilidade do método em bloco, mas usando outra sintaxe:
- Código:
-
class Pessoa
attr :nome, :nascimento, :cpf
def metodoPublico
end
def metodoProtegido
end
def outroMetodoProtegido
end
def metodoPrivado
end
def outroMetodoPrivado
end
def deNovoMetodoPublico
end
public :metodoPublico, :deNovoMetodoPublico
protected :metodoProtegido, :outroMetodoProtegido
private :metodoPrivado, :outroMetodoPrivado
end
Modules, os helpers e classes agrupadasAlém das classes normais, temos também os "Modules", que são
parecidas com classes, mas servem para agrupar os métodos que
geralmente colocamos nas classes "Helper" em outras linguagens. Dessa
forma, podemos fazer um módulo Debug que tem diversos métodos úteis
para a depuração de nossos programas. Por exemplo, podemos adicionar um
método que nos retorna informações sobre um objeto (instância):
- Código:
-
module Debug
LEVEL = "producao"
def info
"#{self.class} (\##{self.object_id}): #{self.to_s}"
end
end
Este código foi baseado no exemplo de Modules do livro "Pickaxe"
(Programming Ruby: The Pragmatic Programmer's Guide). Em Java, podemos
fazer algo semelhante, utilizando frameworks para orientação a
aspectos, que são, em geral, mais complexos: ou alteram o fonte logo
antes da compilação, ou alteram o byte-code de classes já compiladas.
Em ambos os casos, o código é "injetado" em cada classe, diferente do
paradigma do
Ruby, que "herda" o comportamento, deixando o código em apenas um lugar.
Mixin's, resposta simples ao problema da herança múltiplaEm Orientação a Objetos, a herança múltipla é geralmente considerada
um grande problema, pois pode acabar trazendo mais danos do que
vantagens.
Ruby, assim como a maioria das linguagens OO, não
suporta herança múltipla diretamente. Ao invés disto, você pode
adicionar comportamentos a uma classe, utilizando os Mixin’s. Eles
funcionam como os includes: você só declara qual a classe que deseja
herdar o comportamento. Deste jeito:
- Código:
-
class MeuObjeto < ObjetoPai
include Debug
include Comparable
end
Nesta classe, estamos herdando diretamente de ObjetoPai, mas
"incluindo" o comportamento das classes "Debug" e "Comparable",
deixando isso totalmente transparente à classe usuária, mantendo o
encapsulamento.