quinta-feira, 28 de fevereiro de 2013

Trabalhando com Ruby Parte 5 (Variáveis, Ranges, Hashes)

Primeiramente quero homenagear Ruby pelos seus 20 anos. Essa linguagem vem acolhendo a cada dia mais profissionais querendo aprender essa poderosa linguagem, ganhando mérito pela sua forma simplificada de programar para WEB. 

Variáveis
Todas as variáveis em Ruby são objetos, e vale lembrar que Ruby possui tipagem dinâmica e tipagem forte. Os nomes das variáveis ​​são compostas de letras, números e sublinhados. A grande sacada disso é, por exemplo, usar caracteres especiais para defini-las.
  1. Atribuição simples:
    variavel = 10
    =>10
  2. Caracter especial:
    ação = "funciona"
    =>funciona
  3. Atribuição paralela:
    assim, também, funciona = "nota 10", 777, [:diga=>'oi']
    =>["nota 10",777, [{:diga=>"oi"}]]
  4. Variavel global:
    $global = ''global"
    =>"global"
  5. Variavel constante. Toda constante deve ser definida caracteres CAIXA ALTA:
    CONCRETO = "ninguém meche aqui"
    =>"ninguém meche aqui"
  6. Variavel de instância (usada em Classes onde veremos em próximos artigos):
    @instancia = 123
    =>123
  7. Variavel da classe:
    @@classe = nil
    =>nil
  8. Descobrindo uma variável. Como Ruby tem tipagem dinâmica, é possível visualizar qual a tipagem que ele definiu a aquela determinada variável, para isso usamos a função class:
    var = 'teste'
    =>teste
    var.class
    =>String
  9. Exibindo erro, (Ruby tem sua tipagem forte, isso é, resulta em um erro caso algo for forçado)
    a = 1
    =>1
    b = 'teste'
    =>'teste'
    a+b
    =>TypeError: String can't be coerced into Fixnum 
    
Ranges
Ranges tem como objetivo trabalhar com valores em intervalos, declarando um valor inicial e um valor final, assim percorrendo de forma sequencial.
  1. Exemplo básico:
    range = 1..10
    =>1..10
    range.each {|x|
     puts x
    }
    => 1,2,3,4,5,6,7,8,9,10
    
  2. Todos menos o ultimo, (note que usei um ponto a mais, assim limita o ultimo elemento a ser anulado):
    range = 1...10
    =>1..10
    range.each {|x|
     puts x
    }
    => 1,2,3,4,5,6,7,8,9
    
  3. Evoluindo com palavras:
    nomes = ('a'..'z')
    =>'a'..'z'
    nomes.each {|n|
     puts n
    }
    => a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
    
    
  4. Verificando existencia de algo, (note que usei a função include para verificar a existencia de um elemento incluso no range):
    var = 1..10
    =>1..10
    if var.include?(6)
     p 'tem'
    else
     p 'nao tem'
    end
    => "tem"
    
Hashes
De forma parecida com Array, seu diferencial é um indice de Array mais completo com chaves e valores.
  1. Atribuição de Hash comum, (estou usando Symbol, String, Fixnum para determinar uma chave):
    hash = {:cao=>'late',:leao=>'ruge','papagaio'=>'fala',1=>'um'}
    =>{:cao=>'late',:leao=>'ruge','papagaio'=>'fala',1=>'um'}
  2. Retornando Hash determinado:
    hash = {:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    =>{:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    puts hash[:leao]
    =>'ruge'
  3. Retornando Chaves, (aconselho usar somente Symbol para determinar as chaves, por questão de desempenho):
    hash = {:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    =>{:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    puts hash.keys
    =>[:gato, :cao, :leao]
  4. Retornando Valores:
    hash = {:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    =>{:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    puts hash.values
    =>["mia", "late", "ruge"]
  5. Atribuindo novo elemento:
    hash = {:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    =>{:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    hash[:bode] = 'berra'
    =>"berra"
  6. Retornando tamanho:
    hash = {:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    =>{:gato=>'mia',:cao=>'late',:leao=>'ruge'}
    puts hash.size
    =>3 
Autor: Darlan Dieterich