Esse artigo faz parte da revista Java Magazine edição 68. Clique aqui para ler todos os artigos desta edição

AN style="FONT-FAMILY: Verdana; BACKGROUND: white; COLOR: red; FONT-SIZE: 10pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">

PAN>

: windowtext; FONT-SIZE: 10pt" lang=EN-US>

l align=left>Uma vez entendido o JRuby, daremos uma olhada no famoso framework de persistência do Ruby, o ActiveRecord, e veremos como algumas ‘mágicas’ de metaprogramação do Ruby podem tornar um framework mais ágil e intuitivo.

 

Para que serve:

Fornecer um meio de utilizar os conceitos avançados da linguagem Ruby como metaprogramação, closures, etc. sem ter que abandonar a plataforma Java, obtendo assim o melhor dos dois mundos.

 

Em que situação o tema é útil:

Linguagens dinâmicas estão em moda e são excelentes para descrever um algoritmo complexo devido a sua forte expressividade. Sabendo utilizar o JRuby você terá ao seu dispor uma importante ferramenta para programar a sua lógica de uma maneira clara e eficiente, sem ter que abandonar a já madura plataforma Java.

 

Explorando o JRuby:

O JRuby permite utilizar todos os recursos da linguagem Ruby dentro da plataforma Java. Por exemplo, é possível utilizar closures e metaprogramação, duas funcionalidades bastante interessantes da linguagem Ruby e que não são suportadas pela linguagem Java. Executar código Ruby a partir de código em Java e vice-versa fica fácil com o JRuby. Com a maturidade do JRuby, a tendência é termos os programadores Java utilizando o Ruby dentro da máquina virtual ao invés de partirem para soluções 100% Ruby.

 

 

Nesse artigo exploraremos como utilizar o JRuby para que você possa usufruir de todo o poder da linguagem Ruby sem ter que abandonar a plataforma Java. Veremos como instalar e configurar o JRuby corretamente para executar de maneira fácil qualquer código Ruby dentro da máquina virtual Java. Veremos também como fazer chamadas de Java para Ruby e vice-versa.

Uma vez entendido o JRuby, daremos uma olhada no famoso framework de persistência do Ruby, o ActiveRecord, e veremos como algumas ‘mágicas’ de metaprogramação do Ruby podem tornar um framework mais ágil e intuitivo.

O Que é o JRuby?

O JRuby é uma implementação open-source em Java da linguagem Ruby. Isso significa que em teoria qualquer código Ruby pode ser executado dentro da máquina virtual Java. O JRuby entretanto vai além disso, permitindo um mix de Java com Ruby, ou seja, é possível usar objetos Ruby dentro de código Java e objetos Java dentro de código Ruby. Com o aumento da popularidade do framework web Ruby on Rails, ficou claro que algumas técnicas da linguagem Ruby seriam muito difíceis de serem reproduzidas pela linguagem Java. Foi nesse ambiente que surgiu o projeto JRuby, que com a posterior contratação dos principais desenvolvedores pela Sun, sinalizou para o mercado que as vantagens desta linguagem dinâmica não poderiam ser negligenciadas pela plataforma Java.

Java versus Ruby

Analisar a linguagem Ruby com todas as suas particularidades está fora do escopo desse artigo. Mas antes de começarmos vamos fazer um rápido comparativo entre Ruby e Java. Podemos afirmar que Java é uma linguagem de programação estática, compilada e orientada a objetos, enquanto Ruby é uma linguagem dinâmica, interpretada e orientada a objetos.

Em Java uma variável precisa ser declarada com um tipo, e uma vez declarada o seu tipo não pode mais ser alterado. Por isso que se diz que Java é uma linguagem de tipagem estática, enquanto Ruby é uma linguagem de tipagem dinâmica. Em Ruby, assim como em JavaScript, Perl e Python, uma variável pode armazenar diversos tipos de objetos diferentes ao longo de sua vida. O código abaixo apresenta um exemplo dessa característica do Ruby em relação ao Java.

 

// Java

String s = "Java";

s = 1; // Erro de compilação

 

# Ruby

s = "Ruby"

s = 1  # Ok

 

Aqui cabe a observação de que ser dinâmica, e consequentemente mais flexível, não é necessariamente melhor que ser uma linguagem estática. Essa é sempre uma questão relativa à aplicação. O fato de Java ser uma linguagem estática permite que o compilador detecte diversos erros, o que pode garantir uma maior robustez. Se um método precisa receber uma variável do tipo Integer e devido a um erro de programação ele recebe uma variável do tipo Float, em Java esse erro será mostrado pelo compilador – e se você estiver utilizando uma IDE moderna provavelmente ficará sabendo do seu erro no mesmo instante em que o digitar. Em Ruby esse erro será detectado apenas quando o sistema for executado, seja no ambiente de testes ou em produção.

No entanto, IDEs com editores cada vez mais inteligentes, por exemplo o NetBeans 6.5, começam a oferecer recursos como completamento automático e validação estática para Ruby.

Outra diferença importante entre Java e Ruby é que em Ruby não há tipos primitivos, isto é, toda e qualquer variável e valor em Ruby é necessariamente um objeto. É comum encontrar amantes de Ruby afirmando com orgulho que Ruby é uma linguagem 100% orientada a objetos (“OO-pura”). Apesar dessa afirmação ser totalmente verdadeira, as suas vantagens também são relativas à aplicação em questão. Variáveis primitivas não são armazenadas na memória heap como os objetos, não são coletadas pelo coletor de lixo (Gargage Collector), não possuem referências, são menores e podem ser armazenadas diretamente no stack e até mesmo nos registradores da CPU. Java suporta tipos primitivos por uma questão de performance, enquanto Ruby aboliu as variáveis primitivas por uma questão de consistência e simplicidade. Veja na Listagem 1 alguns exemplos de objetos em Ruby.

 

Listagem 1. Objetos em Ruby.

# Tudo em Ruby é um objeto:

1.class       # Fixnum

3.14.class    # Float

0.class       # Fixnum

false.class   # FalseClass

true.class    # TrueClass

nil.class     ...

Quer ler esse conteúdo completo? Tenha acesso completo