Por ser uma linguagem com inferência de tipos, muitos pensam que o tipo não im-
porta para o interpretador como acontece com o PHP. Confuso? Vamos ver isso na
prática.
Se criarmos duas variável em um código PHP qualquer, sendo uma contendo
uma String, como valor 27 e outro de
tipo numérico com valor 2:
<?php
$idade = 27;
$multiplicador = "2";
$idade * $multiplicador;
?>
Ao executarmos o código acima, o resultado será 54. Para o interpretador do
PHP, quando executamos uma operação matemática envolvendo uma variável do
tipo int e uma do tipo String, os valores das variáveis podem ser automatica-
mente convertidos para outros tipos, a fim de possibilitar a operação.
Se executarmos exatamente o mesmo código em Ruby:
idade = 27
multiplicador = "2"
idade * multiplicador
10
Casa do Código
Capítulo 1. Uma introdução prática à linguagem Ruby
Opa! Não funcionou. O interpretador retornou TypeError: String can't
be coerced into Fixnum. O Ruby não permite que uma variável Fixnum seja
somada com outra do tipo String, diferentemente do que ocorre no PHP, que
permite este tipo de operação. Isso acontece porque para o interpretador Ruby é
impossível multiplicar um número com um texto.
Essa característica da linguagem de realizar operações em variáveis de tipos di-
ferentes é o que chamamos de tipagem fraca ou forte. No caso do Ruby, onde o tipo
é determinante para o sucesso da operação, dizemos que a linguagem tem tipagem
forte.
Tendo a tipagem forte em mente, vamos ir mais além. Execute o seguinte código:
idade = 27
idade = "27"
Funcionou?
Este código funciona normalmente, porque não estamos fazendo nenhuma ope-
ração que misture os tipos. O código acima apenas atribui um Fixnum à variável
idade e depois atribui um outro valor, só que do tipo String. Quando a linguagem
permite que o tipo da variável possa ser alterado durante a execução do programa,
dizemos que ela tem tipagem dinâmica.
Em contrapartida, outras linguagens possuem tipagem estática, ou seja, uma vez
que a variável é criada como um int, ela só poderá ser um int. Esse é o caso do
Java, onde o compilador cuida de fazer essa checagem.
Esta é uma das características mais criticadas pelos desenvolvedores que prefe-
rem linguagens com tipagem estática, uma das alegações é que em linguagem com
tipagem estáticas podemos descobrir erros durante a compilação. Porém, veremos
durante o livro que a tipagem dinâmica é uma das características mais poderosas da
linguagem, trazendo tamb;em muitos benefícios.
Vale lembrar que os conceitos forte, fraca, dinâmica e estática não são tão simples
assim. É mais fácil falar se uma linguagem é mais ou então menos fortemente tipada
que outra, por exemplo. Nesse capítulo apenas tocamos de leve nesse assunto.
1.5
Uma linguagem interpretada e com classes aber-
tas
Ruby é uma linguagem interpretada, ou seja, não existe um processo de compilação
para um binário executável, como acontece na linguagem C, por exemplo. Em Ruby,
11
1.5. Uma linguagem interpretada e com classes abertas
Casa do Código
existe um arquivo com a extensão .rb e um programa cujo papel é interpretar o
conteúdo deste arquivo, transformando-o em instruções de máquina e executando
o comportamento esperado.
Vamos para um exemplo prático que precisamos resolver: descobrir o plural de
todas as palavras, por exemplo.
Um caminho natural para solucionar este problema, é criar um método que re-
cebe uma String como entrada e adicione um s após a sua última letra (sim, estou
pensando apenas nos casos mais simples).
Vamos ao código que soluciona este problema:
def plural(palavra)
"#{palavra}s"
end
puts plural("caneta") # canetas
puts plural("carro") # carros
Não se preocupe ainda com o significado do # dentro da String no método
plural, vamos falar bastante dela durante o livro. O puts é um método simples
que pega o argumento passado e joga para a saída padrão. Dentro do IRB, bastaria
escrever plural("caneta") que automaticamente o interpretador joga o resul-
tado no console. Faça o teste!
Olhando este código com cuidado, ele não nos parecerá tão orientado a objetos
assim. Repare que os dados e os comportamentos estão separados, mas podemos
tentar melhorar isso. Já que o método plural age somente na própria String,
nada mais
natural que ele esteja na classe String, assim usaríamos:
puts "caneta".plural
puts "carro".plural
Porém, ao executarmos o código acima receberemos o seguinte erro como re-
torno:
NoMethodError: undefined method `plural' for "caneta":String
Isso significa que objetos do tipo String não possuem o comportamento
plural. Mas espera aí... e se escrevêssemos o método plural dentro da classe
String?
12
Casa do Código
Capítulo 1. Uma introdução prática à linguagem Ruby
class String
def plural
"#{self}s"
end
end
Agora tente executar o código que coloca a String caneta no plural:
puts "caneta".plural # canetas
Agora funciona! O que fizemos foi abrir a classe String durante a execução