char a= 'a';
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
ahh muito bom :)
ResponderExcluirmassaaa
ResponderExcluirhttp://maironbrasil.wordpress.com
abraco
Muito bem explicado.
ResponderExcluirParabéns!
Legal, um blog de Ruby.
ResponderExcluir_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?!
ResponderExcluirUriel, você está certo, Java possui tipagem forte e estática
ResponderExcluirSimples e objetivo. rsrs
ResponderExcluirValeu Samuel.
De onde tu tirou q C é fracamente tipada? teu exemplo pra provar isso é uma aberracao.
ResponderExcluirchar em C é int, conhecido como int pequeno pelo intervalo dele.
logo 'a' + 'b' é a mesma coisa q 97 + 98, e promocao nao é considerado tipagem fraca, é so uma conversao de um tipo menor para um maior, toda linguagem faz isso, ate java faz.
Nunca programou em java?
float f;
int a = 10;
f = a;
isso é java e funciona, agora java é fraco tbm?
Entenda uma coisa. dinamicamente tipada significa q nao é necessario declarar tipos.
ex: python
a = 'texto'
Estatica tem q declarar, como no java
Tipagem fraca significa q pode haver mudanca de tipo, ja programou em php?
exemplo:
$a = 'a'; //string
$a = 1; //integer
tipagem forte o tipo nao muda.
Java, C
em C pode fazer isso aki
int a;
float f = 10.2;
a = f;
isso é um cast implicita, nao ha mudanca de tipo, continua sendo int e como float nao cabe em int ha perda de informacao, mas so isso, continua forte.
Entendeu?
Valeu Felipe pelo comentário!
ExcluirC possui algumas características de linguagem fracamente tipada, assim como possui características de fortemente tipada.
Características fracamente tipada:
- a existência de coerção: Aahz fala que se, em uma linguagem estaticamente tipada, existe a possibilidade de forçar o uso de um tipo como se fosse outro, o que é chamado de coerção e existe em C, isso é um sintoma de linguagem fracamente tipada. Veja os textos: http://www.artima.com/weblogs/viewpost.jsp?thread=7590 e http://en.wikipedia.org/wiki/C_programming_language#Syntax
- a existência de ponteiros: A possibilidade de se alterar determinados objetos diretamente na memória também é um sintoma de linguagem fracamente tipada. Nessa linha, um bom exemplo é o void *:
Características fortemente tipada:
- a rigidez das assinaturas: Um exemplo disso é o fato de não ser possível chamar métodos com objetos deferentes dos descritos na assinatura dos métodos.
Indo direto ao assunto, ainda considero C fracamente tipada. Penso assim, até então, por considerar fortes as características que apontam para tal. Entretanto, isso é uma opinião, não um fato consumado. Logo, o mais correto é retirar essa afirmação do post.
Essa questão foi bem abordado no StackOverFlow (http://stackoverflow.com/questions/430182/is-c-strongly-typed) e também não houve um consenso. Vale a pena ver.
Outro texto sobre isso está em http://stackoverflow.com/questions/121385/what-are-the-key-aspects-of-a-strongly-typed-language#122751