{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
23/06/2010
Continuando a falar sobre Ruby/IronRuby para apaixonados por .net c# ou vb.net.Quando comecei a estudar Ruby eu senti uma grande resistência pois estava tentando, a todo momento, compará-la com C#. Esta é uma postura complicada, pois as duas linguagens seguem abordagens bem distintas. Então deixo a dica de estarem abertos ao estudo desta linguagem. Não é pecado estudar uma enquanto se trabalha com a outra.Uma das coisas que mais me chamou a atenção em Ruby é sua simplicidade. Um programa em Ruby pode ser feito com apenas uma linha, incrível.E desta forma, simples e clean, segue todo o trabalho com Ruby.
No nosso dia-a-dia com .Net trabalhamos muito com coleções.
array = Array.newCom isto criamos um array vazio. Poderíamos utilizar a seguinte sintaxe também:
array = []Isso também significa que estamos criando um array. Clever!Novamente percebemos que não existe a definição de tipos, desta forma nosso array já é um array genérico.Podemos adicionar alguns itens:
array = []
array[0] = "Vinicius"
array[1] = "Quaiato"
array[2] = 2010Agora a coisa começa a ficar interessante. Temos métodos muito bons para utilizarmos com as coleções:
array = ["Vinicius", "Quaiato", "Janynne", "Gomes", ".Net", "Ruby"]
# obtendo o primeiro e o último elementos do array
puts array.first
puts array.last
# obtendo um range de elementos
puts array[0..3]
# obtendo o índice através de um valor
puts array.index(".Net")Na linha 1 criamos um objeto utilizando a inicialização “automagica” de arrays.Nas linhas 4 e 5 invocamos os métodos first e last. Não precisamos explicar estes métodos né? =DNa linha 8 temos algo interessante. Ao invés de acessarmos um único índice do array, nós acessamos um range de valores. Neste caso estamos dizendo “me dê os elementos que vão dos índices 0 até 3”, sendo que tanto o índice 0 quanto o índice 3 estão inclusos.Na linha 11 o método index retorna o índice no qual o elemento “.Net” está. Caso não exista o elemento informado, retorna nil.
Nem sempre um array resolve todos os problemas. Podemos precisar de uma coleção indexada por chaves. Em .net chamamos isso de dicionários, em Ruby chamaremos isso de Hash.
hash = {}
hash["nome"] = "Vinicius"
hash["sobrenome"] = "Quaiato"Assim como criamos um array com [] (colchetes) podemos criar um hash com {
(chaves).Definimos então duas chaves (que podem ser objetos de qualquer tipo), e seus valores. Simples!Poderíamos ter feito isso também:
hash = { "nome" => "Vinicius", "sobrenome" => "Quaiato" }O código é bem simples. Do lado esquerdo da “flexa” está a chave, e do lado direito o valor.Podemos ainda trabalhar com uma espécie de “enum”:
hash = { :nome => "Vinicius", :sobrenome => "Quaiato" }Na verdade isso é chamado de Symbol. é criado utilizando a sintaxe :alguma_coisa ou :”alguma coisa”.E para tornar a brincadeira interessante, vamos ver alguns métodos de um hash:
# obtendo todas as chaves
puts hash.keys
# obtendo todos os valores
puts hash.values
# obtendo o maior valor
puts hash.values.max
# obtendo o menor valor
puts hash.values.minOs métodos tem nomes bem explicativos, nem preciso dizer mais nada. =DTemos ainda algumas operações interessantes que podem ser realizadas como a comparação de dois hashes:
hash1 = { :a=>"maçã", :cor=>"verde", :preco=>10}
hash2 = { :preco=>10, :a=>"maçã", :cor=>"verde"}
# retornará true
puts hash1 == hash2
hash2 = { :preco=>10, :a=>"Abacaxi", :cor=>"verde"}
# retornará false
puts hash1 == hash2Quando comparamos dois hash desta maneira o resultado será verdadeiro(igualdade) quando ambos possuírem a mesma quantidade de itens, e quando todas as chaves e todos os valores forem iguais, neste caso, indepente da ordem.Podemos definir um valor default para um hash. Este valor funciona no caso de tentarmos obter algo que não existe, uma chave inexistente por exemplo.Há algumas formas de fazer isso:
# definindo valor default no construtor do Hash
hash = Hash.new("padrão")
# irá exibir 'padrão'
puts hash[:chave_invalida]
# setando o valor default diretamente
hash.default = 2010
# irá exibir 2010
puts hash.defaultPodemos deletar um item assim:
hash = { :a=>"a", :b=>10, :c=>Object.new}
# exibe 3
puts hash.size
hash.delete(:a)
# exibe 2
puts hash.sizePara saber se um hash está vazio ou para limpá-lo:
hash = {}
# exibirá true
puts hash.empty?
hash = { :a => "a", :b => 10, :c => Object.new }
# exibirá false
puts hash.empty?
# limpamos todos elementos
hash.clear
# exibirá true
puts hash.empty?Notem que interessante o método empty. ele possui um ponto de interrogação. Fica muito mais claro e inteligente sabermos que se trata de uma “pergunta” que estamos fazendo ao objeto. Simplesmente incrível.Ainda temos alguns outros métodos bem interessantes, porém mostrarei em uma próxima parte, onde começaremos a falar de blocos de código, algo equivalente a nossas lambda expressions.Ainda voltaremos a falar de classes, propriedades, herança, parâmetros, etc. Há muito post a ser feito =DAbraços, e lembrem-se: feedback é bem vindo!Vinicius Quaiato.