classes e MAIÚSCULAS para valores, de forma a distingui-los facilmente.
EULER = 2.718 # Constante da forma correta
Pi
# Classe?
Cuidado! Constantes não são constantes!
Infelizmente é possível alterar valores de constantes no Ruby. Ao ten-
tarmos fazer isso, porém, o interpretador irá exibir uma mensagem de
alerta:
PHI = 1.618
PHI = 999
# (irb):9: warning: already initialized constant Pi
# => 999
PHI
# => 999
Arrays
Arrays em Ruby possuem representação literal, parecido com Python e Perl e
também podem conter qualquer tipo de objetos:
a = [1, 2, 1+2]
# [1, 2, 3]
a << 4
# [1, 2, 3, 4]
a << "string!"
# [1, 2, 3, 4, "string"]
15
2.3. Tipos e estrutura de dados
Casa do Código
O comportamento de Arrays é bem parecido com strings, ou seja, é possível usar
Ranges e o método [] para acessar elementos diretamente:
a = ["a", "b", "c", "d", "e"]
a[0]
# 'a'
a[0..2]
# ["a", "b", "c"]
a[0, 2]
# ["a", "b"] - Atenção a este exemplo!
É possível fazer atribuição de elementos de Array de uma forma bastante conve-
niente:
list = ["a", "b", "c"]
first, second = list
first # => "a"
second # => "b"
Usando o splat
operator, é possível obter o restante de toda a lista:
list = ["a", "b", "c"]
first, *tail = list
first # => "a"
tail # => ["b", "c"]
Array de strings são chatas de digitar, portanto o Ruby tem uma maneira para
facilitar isso:
a = %w{a b c d e}
a # ["a", "b", "c", "d", "e"]
# Porém, palavras com espaços são problemáticas
b = %w{"long words" small tiny}
# ["\"long", "words\"", "small", "tiny"]
# Palavras com espaços devem ser "escapadas"
c = %w{long\ words small tiny}
# ["long words", "small", "tiny"]
Arrays também fazem operações matemáticas:
a = ["a", "b", "c"]
b = ["a", 2, 3]
16
Casa do Código
Capítulo 2. Conhecendo Ruby
a + b # ["a", "b", "c", "a", 2, 3]
a - b # ["b", "c"]
b - a # [2, 3]
c = [1, 2]
c * 3 # [1, 2, 1, 2, 1, 2]
Além dessas operações mais canônicas, Arrays ainda suportam interseção e
união de conjuntos:
a = [1, 2, 3]
b = [3, 4, 5]
a + b
# [1, 2, 3, 3, 4, 5]
a | b
# [1, 2, 3, 4, 5] - Na união, elementos duplicados são removidos
a & b
# [3] - Na interseção, apenas os repetidos ficam
Arrays não deixam de ser objetos em Ruby, portanto possuem vários métodos
interessantes. No exemplo abaixo vemos o uso dos métodos mais comuns:
[1, 2, 3].reverse
# [3, 2, 1] - inverte o array
['acerola', 'laranja'].join(' e ')
# "acerola e laranja" - concatena strings com o parâmetro passado
[10, 20, nil, '', false, true].compact
# [10, 20, '', false, true] - remove nils
[6, 3, 9].sort # [3, 6, 9] - ordena os resultados
[3, 3, 9].uniq # [3, 9] - apenas os elementos únicos
[[3], 2, 1].flatten # [3, 2, 1] - achata listas internas
a = [1, 2, 3]
a.pop
# 3 - sai o último elemento
a
# [1,2]
a.shift # 1 - sai o primeiro elemento
a
# [2]
17
2.3. Tipos e estrutura de dados
Casa do Código
Note que a maioria desses métodos possui a versão bang, ou seja, terminada em
exclamação, que modifica o conteúdo da própria variável, ao invés de retornar uma
cópia modificada:
a = [[3], 2, 1]
b = a.flatten
a
# => [[3], 2, 1]
b
# => [3, 2, 1]
b = a.flatten!
a
# => [3, 2, 1],
b
# => [3, 2, 1]
18
Casa do Código
Capítulo 2. Conhecendo Ruby
Métodos bang (!)
Em Ruby, é possível criar métodos que terminam em ! e são usados em
principalmente dois casos:
1) Métodos que modificam estado interno do objeto, como vimos no
exemplo anterior;
2) Métodos que, ao falharem, disparam uma exceção.
No uso de métodos do Rails é possível observar o caso em que a versão
bang do método resulta em uma exceção:
Post.find_by_title 'Unexistent post' # => nil
Post.find_by_title! 'Unexistent post'
# ActiveError::RecordNotFound
Hashes
Ruby também possui representação literal para Hashes, tal como Python (apesar
de serem conhecidos naquelas terras por dicts ou dicionários). Hashes são estrutu-
ras de dados similares a Array, porém ao invés de acessarmos valores com índices
numéricos, podemos usar qualquer objeto:
frequency = Hash.new
frequency["hello"] = 1
frequency["world"] = 2
frequency[1] = 10
É possível criar hashes também com uma sintaxe mais cômoda:
# equivalente ao exemplo anterior
frequency = { "hello" => 1, "world" => 2, 1 => 10 }
19
2.3. Tipos e estrutura de dados
Casa do Código
Ainda é possível usar uma terceira sintaxe, usada para criar hashes contendo
símbolos como chaves (veremos mais detalhes sobre símbolos ainda nesta seção).
Veja o exemplo a seguir:
# Sintaxe clássica para hashes tendo símbolos como chaves
frequency = { :hello => 1, :world => 2 }
# Nova sintaxe
frequency = { hello: 1, world: 2 }
Uso de sintaxe de Hash
Não há nenhuma diferença entre as duas sintaxes de hashes com símbo-
los, ou seja, elas são puramente estéticas. Neste livro, vamos nos ater à
sintaxe clássica apenas para manter consistência com outras hashes, fi-
cando à critério do leitor escolher qual prefere usar. Lembre-se apenas
de ser consistente.
Hashes possuem métodos bem úteis. Alguns dos mais