char a= 'a', b='b'; float c = a + b;
Exemplo este que mostra o fato de podermos somar dois chars e atribuirmos a um float.
[ Ao longo do texto o conceito de fracamente tipada ficará mais claro. ]
No entanto, Ruby é dinamicamente, implicitamente e fortemente tipada. Vejamos o que cada um destes adjetivos significam:
Dinamicamente tipada
Quer dizer que, a cada interação, o tipo é verificado. Isso fica claro no seguinte exemplo:
x = 100
(1..4).each{ x = x * 100 ; puts "#{ x.class} #{x}" }
Que gera o resultado:
Fixnum 10000 Fixnum 1000000 Fixnum 100000000 Bignum 10000000000
Como podemos ver a variável x começa como Fixnum e conforme aumenta passa para Bignum sem a necessidade de uma conversão.
Essa característica gera vários pontos positivos na linguagem, tais como:
- Diminui a verbosidade, pois não há a necessidade de fazer conversões;
- Tende a facilitar a vida do programador pois não há a preocupação com conversões.
Mas neste contexto nem tudo são flores, vejamos os pontos negativos:
- A linguagem tende a ser mais lenta, em tempo de execução, devido ao fato de que, a cada interação, o tipo ser verificado;
- Pode confundir o programador pois o mesmo pode não saber exatamente com quais tipos está tratando.
Implicitamente tipada
Continuando no mesmo exemplo, quando fizemos x = 100 não precisamos declarar o tipo de x. Ou seja, não foi necessário fazer algo como: Fixnum x = 100. Isso acontece pelo fato do Ruby detectar o tipo de cada variável em tempo de execução. Uma boa analogia para este fenômeno é pensar nas variáveis como se fossem caixas fechadas e seus dados como fitas coloridas onde o interpretador abre a caixa e verifica as cores das fitas.
Novamente, os pontos positivos e negativos são muito semelhantes aos relacionados a tipagem dinâmica. Veja:
Positivos:
- Diminui a verbosidade, pois não há a necessidade de fazer declarações.
Negativos:
- A linguagem tende a ser mais lenta pois o tipo é verificado em tempo de execução de acordo com a analogia das caixas e fitas;
- Pode confundir o programador pois o mesmo pode não saber exatamente com quais tipos está tratando já que não existe a declaração dos mesmos.
Fortemente tipada
Este é um conceito confuso, mas uma boa forma de explica-lo é dizendo que todas as variáveis devem ter um tipo - ou seja: fazer parte de uma classe no caso do Ruby - e que cada tipo segue a risca seu contrato. Por exemplo:
a = 100 b = "Ruby on Rails" a + b TypeError: String can't be coerced into Fixnum from (irb):54:in `+' from (irb):54
Como você notou, em Ruby não podemos somar um String com Fixnum pois essa operação não está no contrato da classe String e Fixnum.
De fato, o assunto não acaba por aqui, existem alguns materiais na Web e em Livros sobre isso. Em vista disso, e no intuito de incentivar a pesquisa, deixo algumas referencias e até a próxima!
P.S. Os tipos em Ruby na verdade são classes, ou seja: não existem tipos primitivos e sim objetos que pertencem a classes. Ex.:
a = 1 # a pertence a classe Fixnum


7 comentários:
ahh muito bom :)
massaaa
http://maironbrasil.wordpress.com
abraco
Muito bem explicado.
Parabéns!
Legal, um blog de Ruby.
_o/
Muito legal!
Gostei do post, aprendi mais um pouco sobre a tecnologia e seus conceitos.
Bacana! O Java respeita o mesmo procedimento? Você deve que respeitar a Classe, é fortemente tipado, ou estou enganado?!
Uriel, você está certo, Java possui tipagem forte e estática
Simples e objetivo. rsrs
Valeu Samuel.
Postar um comentário