Desculpe, seu navegador não suporta JavaScript! Casa Open: Tipagem em Ruby

Tipagem em Ruby

Cada linguagem de programação tem sua forma de lidar com tipos, por exemplo: C é uma linguagem estaticamente tipada, pois o tipo da variável é definido em tempo de compilação. O que pode ser visto no seguinte exemplo:



  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

9 comentários:

  1. massaaa
    http://maironbrasil.wordpress.com

    abraco

    ResponderExcluir
  2. Legal, um blog de Ruby.
    _o/
    Muito legal!
    Gostei do post, aprendi mais um pouco sobre a tecnologia e seus conceitos.

    ResponderExcluir
  3. Bacana! O Java respeita o mesmo procedimento? Você deve que respeitar a Classe, é fortemente tipado, ou estou enganado?!

    ResponderExcluir
  4. Uriel, você está certo, Java possui tipagem forte e estática

    ResponderExcluir
  5. Simples e objetivo. rsrs
    Valeu Samuel.

    ResponderExcluir
  6. De onde tu tirou q C é fracamente tipada? teu exemplo pra provar isso é uma aberracao.
    char 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?

    ResponderExcluir
    Respostas
    1. Valeu Felipe pelo comentário!

      C 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

      Excluir

Casa Open | by Samuel Vinícius, Belo Horizonte - MG. Powered by Blogger