O código tornou-se obsoleto, se não existirem testes de unidade que validem este
comportamentos, provavelmente ele seria observado somente em produção quando
algum cliente usasse o sistema.
A dica é simples aqui, se a variável de instância é privada, mesmo que a lingua-
gem lhe permita burlar essa característica, não faça, resolva o problema de outra
maneira. Certamente existirá algum método na interface pública do seu objeto que
faça por você a alteração da variável de uma forma segura e correta.
45
Capítulo 4
Estruturas de dados
Ruby possui três tipos de estruturas de dados que veremos com detalhes neste ca-
pítulo. Cada uma destas estruturas possui suas qualidades e defeitos, que vamos
explorar daqui em diante.
4.1
Trabalhe com Arrays
Arrays em Ruby são coleções indexadas, ou seja, guardam objetos em uma determi-
nada ordem e disponibilizam métodos que permitem acessar objetos destas coleções
através do seu índice. Diferente do que acontece com a linguagem
C ou Java, onde
precisamos definir arrays com uma quantidade máxima de objetos, em Ruby os ar-
rays não precisam ter seu tamanho pré definido, eles crescem conforme a necessi-
dade.
Existem várias formas de definir um Array em Ruby, sendo que a mais simples
é utilizando []:
numeros = [1, 2, 3]
4.1. Trabalhe com Arrays
Casa do Código
puts numeros.class # => Array
Criamos um objeto do tipo Array utilizando dois colchetes e separando os vá-
rios elementos do Array com a vírgula. Para acessar os elementos de um Array,
utilizamos o método [indice] que recebe como argumento a posição do elemento
que desejamos acessar, lembrando que em Ruby os índices começam em 0:
numeros = [1, 2, 3]
puts numeros[0] # => 1
puts numeros[1] # => 2
puts numeros[2] # => 3
Quando precisamos acessar o primeiro ou o último elemento podemos fazê-lo
através de métodos ( first e last) da classe Array:
numeros = [1, 2, 3]
puts numeros.first # => 1
puts numeros.last # => 3
Como Ruby é uma linguagem com tipagem dinâmica, podemos adicionar ob-
jetos (adicionar novos elementos em um array se dá através do método <<, bem
parecido com um append, que adicionará o novo elemento no final do Array) de
qualquer tipo dentro de um mesmo Array:
numeros = [1, 2, 3]
numeros << "ola"
puts numeros # [1, 2, 3, "ola"]
# => 1, 2, 3, "ola"
O problema de adicionar qualquer tipo de objeto dentro de um Array, é que
muitas vezes não sabemos qual o objeto que estamos lidando. Por exemplo, vamos
definir um método que recebe um Array como argumento, busca pelo primeiro
elemento, o multiplica por 2 e por fim imprime o resultado na tela:
def multiplica_primeiro_elemento_por_dois(numeros)
puts 2 * numeros.first
end
multiplica_primeiro_elemento_por_dois [1, 2, 3] # 2
multiplica_primeiro_elemento_por_dois ["abc", 2, 3]
# => TypeError: String can't be coerced into Fixnum
48
Casa do Código
Capítulo 4. Estruturas de dados
Veremos que existem vantagens na tipagem dinâmica das estruturas de dados
em Ruby nos próximos capítulos.
A criação de array de strings
Para criar um Array de strings, a sintaxe utilizada pode ser a mesma que usamos
para criar um array com outros tipos de elementos:
palavras = ['ola', 'mundo']
p palavras # => ["ola", "mundo"]
Existe uma sintaxe mais simples para criar um array de palavras:
palavras = %w{ola mundo}
p palavras # => ["ola", "mundo"]
A vantagem de usar o %w{} é poder separar as palavras que compões o Array
utilizando espaço e não vírgula, assim poluindo pouco o código. Podemos utilizar
também o %W{}, que permite a interpolação de valores nas palavras que compõe o
array:
nome = "Lucas"
palavras = %W{ola #{nome}}
p palavras # ["ola", "Lucas"]
4.2
Guardando nosso livros
Aproveitando que agora conhecemos um pouco de uma estrutura de dados Ruby,
vamos guardar as instâncias dos objetos Livro que criamos dentro dela.
biblioteca = []
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 70.5
web_design_responsivo = Livro.new "Tárcio Zemel", "452565", 189, 67.9
biblioteca << teste_e_design
biblioteca << web_design_responsivo
puts biblioteca
# => Autor: Mauricio Aniche, Isbn: 123454, Páginas: 247
# => Autor: Tárcio Zemel, Isbn : 452565, Páginas: 321
49
4.2. Guardando nosso livros
Casa do Código
Hoje, decidimos que vamos guardar os objetos dentro de um Array, mas futura-
mente podemos descobrir outra estrutura que funcione melhor, seja mais rápida ou
forneça vantagens que o Array não oferece. Se optarmos por essa mudança, teremos
que procurar todos os lugares que instanciam objetos do tipo Livro, guardando-os
dentro de um array, e adaptar o código para a maneira da nova estrutura.
Para nos protegermos desse problema, podemos isolar o código que faz essa atri-
buição em um único ponto, que será invocado em outras partes do código. Assim,
alteramos em um só lugar e o sistema inteiro está modificado. Essa conceito chama-
se encapsulamento.
Vamos isolar este comportamento de guardar livros
dentro de um array, em