Dando continuação ao último post, continuarei o curso(ao invés de estudar para a prova de certificação de amanhã), vamos à segunda parte do nosso mini curso de ruby e rails. Continuemos com a tipagem.
Tipagem em Ruby – Continuação
Strings e números
Como dito anteriormente, o Ruby é uma linguagem dinamicamente e fortemente tipada, e possui alguns tipos primitivos(Não?! Sério?). Mas o “primitivo” do Ruby é um pouquinho diferente. Os tipos do Ruby são implícitos, ou seja: Tudo é objeto. O que significa que eu posso utilizar um código como esse:
puts 15.to_f
O código acima irá escrever “15.0″ na tela(o método to_f transforma em float, assim como o to_s transforma em string e o to_i transforma em inteiro – este último, Fixnum ou Bignum dependendo da necessidade).
Uma das vantagens de ser dinamicamente tipada é que ela “escova bits” sozinha, ou seja: Não há desperdício de memória alocando valores pequenos em espaços grandes. As Strings(vetores de caracteres) fazem parte dos tipos primitivos do Ruby, e na sua utilização não há nenhum grande diferencial para outras linguagens(exceto o fato de poderem ser atribuídas com aspas simples ou duplas – tal qual no PHP). Mas nos tipos numéricos é que o Ruby possui algo “incomum”. Normalmente somos acostumados a trabalhar com variáveis do tipo int(ou Integer, para os programadores VB), e assumir que só existe um tipo inteiro (Int32, tipos como Int16/short e Int64/long não são amplamente utilizados). Já no caso dos valores de ponto flutuante(float e double) somos um pouco mais acostumados a prestar atenção. E é nisso que o Ruby se diferencia, ele tem 2 tipos inteiros e apenas um flutuante, como podemos observar abaixo:
Como o nome mesmo diz, os números bignum são os inteiros “grandes”. Seu limite é aproximadamente 2²¹⁸. Os números Fixnum, ou “inteiros pequenos” vão de -2³⁰ a 2³⁰⁻¹.
Símbolos
Símbolos em Ruby são um enigma. Nós utilizamos, mas muitos não entendem. Simplificando, símbolos são o que você usa para representar nomes e strings. O que ele faz é te dar uma forma eficiente de ter nomes descritivos, poupando o espaço em memória que seria usado para gerar uma seqüência de caracteres para cada instância de nomeação. Por exemplo:
comida = {"Entrada" =>"Shimeji", "Prato Principal" =>"Sushis variados", "Sobremesa" => "Melancia"}
Para simplificar um pouco mais, os símbolos servem para evitar múltiplas instâncias do mesmo objeto. Como eu disse anteriormente, no Ruby tudo é objeto. E uma das particularidades da linguagem é que cada objeto tem um ID. Observe abaixo o que acontece:
Perceba que os IDs são diferentes, embora a string e a linha de comando sejam exatamente iguais(estou usando o IRB – console do Ruby). As duas strings são objetos diferentes em memória. O verdadeiro motivo por trás de um símbolo é ser tão eficiente em consumo de memória quanto uma variável global e ao mesmo tempo tão legível quanto uma string. Notem pelo exemplo que eu dei na variável comida, que a notação já é de string. É algo como um dicionário (interface IDictionary no .NET e no Java). Veja agora como ficaria a mesma expressão utilizando Symbols:
Note que agora o ID do objeto é o mesmo, o que a longo prazo nos pouparia muita memória em uma aplicação. E vejamos como fica o exemplo da comida:
Após executar esse exemplo, tente executar as seguintes linhas:
minhaJanta = comida["Entrada"] puts minhaJanta minhaJanta.object_id comida["Entrada"].object_id
Você verá que tanto o valor da variável minhaJanta quanto o object_id da mesma serão iguais aos de comida["Entrada"].
Bem, por enquanto é só. Espero que tenham gostado. Tentarei continuar correndo com os artigos por aqui. Dúvidas e sugestões, os comentários estão abertos. Abraços e keep coding!




Deixar um comentário