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

14 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
  7. PG SLOT เล่นง่าย ได้เงินไว เครดิตฟรี100 เปิดให้บริการเข้ามาเล่นได้ตลอด 1 วัน เล่นสล็อต แจกเครดิตฟรี pg slot เครดิตฟรีล่าสุดสำหรับผู้เล่นผู้ใดที่กำลังมองหา pg slot เครดิตฟรี 100

    ResponderExcluir
  8. เล่นเกมสวีทโบนันซ่าเว็บอะไรดีเป็นคำถามที่เจอบ่อยที่สุดในสล็อตวันนี้เรามีคำตอบดีๆมามอบให้กับเหล่าสมาชิกทุกคนให้ทราบกัน ในการเลือกเล่นเกมสวีทโบนันซ่าให้ผู้เล่น เลือกเล่นเว็บที่มีอัตราการเล่นขั้นต่ำที่ถูกที่สุด เพื่อเป็นการเปิดโอกาสให้กับเหล่าสมาชิก ทุกคนที่มีทุนน้อยได้ เข้าเล่นเกมดังโบนัส ออกบ่อยที่สุด BETFLIX BETFLIX

    ResponderExcluir
  9. ไม่ต้องเสียเวลารอนาน BETFLIXมีการบริการที่ดี AK88BETเข้าเล่นเกมสล็อต ได้ไม่ต้องมีปัญหา

    ResponderExcluir
  10. ในเกมสล็อตแตกง่าย ที่ไม่ซ้ำกัน ด้วยรางวัลมากมาย ได้ด้วยเกมสล็อต betflix เครดิตฟรี เกมสล็อตออนไลน์ที่แจ็คพอตแตกง่ายที่สุด

    ResponderExcluir
  11. ผู้ให้บริการ betflix เบทฟิก แหล่งรวมเกมสล็อตออนไลน์ เครดิตฟรี และคาสิโนออนไลน์(Casino Online) ที่รวมรวมค่ายต่างๆมาไว้ให้คุณเลือกเล่น มากกว่า 40 บริษัท มากที่สุดในประเทศไทย

    ResponderExcluir

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