Matias Leidemer
Published on

Se divertindo com o método transpose

Embora eu tenha usado poucas vezes, o método Array#transpose do ruby é muito interessante. Dependendo da sua forma de uso, pode apresentar soluções muito poderosas.

names = %w(matias jose mateus)
# => ["matias", "jose", "mateus"]

last_names = %w(leidemer gomes lorandi)
# => ["leidemer", "gomes", "lorandi"]

[names, last_names].transpose
# => [["matias", "leidemer"], ["jose", "gomes"], ["mateus", "lorandi"]]

Neste exemplo, o método junta os primeiros nomes definidos em names junto com os sobrenomes definidos em last_names, baseado nos índices de cada nome/sobrenome.

Usando o construtor do Hash, podemos criar uma estrutura ainda mais interessante:

result = [names, last_names].transpose
# => [["matias", "leidemer"], ["jose", "gomes"], ["mateus", "lorandi"]]

Hash[result]
# => {"matias"=>"leidemer", "jose"=>"gomes", "mateus"=>"lorandi"}

A utilização faz mais sentido quando você possui uma coleção de dados e precisa, por exemplo, identificar cada tipo de dado. Aqui, com o uso da classe OpenStruct, fica fácil de criar uma estrutura.

require 'ostruct'

columns = %w(title description published_at)
# => ["title", "description", "published_at"]

data = ["Super Post", "Big description here", Date.new(2014, 5, 8)]
# => ["Super Post", "Big description here", 2014-05-08 00:00:00 -0300]

hash = Hash[[columns, data].transpose]
# => {"title"=>"Super Post", "description"=>"Big description here", "published_at"=>2014-05-08 00:00:00 -0300}

blog = OpenStruct.new hash
# => #<OpenStruct title="Super Post", description="Big description here", published_at=2014-05-08 00:00:00 -0300>

blog.title
# => "Super Post"

blog.description
# => "Big description here"

blog.published_at
# => 2014-05-08 00:00:00 -0300

Lots of fun.