locado adiante de cada trecho de código, usando um comentário da se-
guinte maneira:
# => Saída
2.3
Tipos e estrutura de dados
A primeira característica que vemos nessas linhas em Ruby é que a linguagem é de
tipagem dinâmica, ou seja, não precisamos declarar nenhum tipo para criar uma
variável. Dessa forma, é possível fazer o seguinte:
a = "string"
# => "string"
a = 100
# => 100
11
2.3. Tipos e estrutura de dados
Casa do Código
Strings
Strings, tal como outras linguagens de script, são fáceis de serem criadas, com
uma notação literal usando aspas duplas ou simples. Porém, como tudo em Ruby é
um objeto, é possível chamar métodos diretamente à notação literal:
"this is sparta".upcase
# => "THIS IS SPARTA"
É também possível compor strings maiores fazendo algumas operações:
"hello" + " " + "world"
# => "hello world"
O interessante também é que Strings reagem à multiplicação. A multiplicação
espera um inteiro como segundo parâmetro:
"." * 10
# => ".........."
É possível também acumular strings usando <<:
greetings = "Hello"
greetings << " "
greetings << "World"
puts greetings # Hello World
Interpolação de strings
Outro fato importante de strings é a interpolação, ou a combinação de código
para a composição de strings. É importante ressaltar que este tipo de interpolação
de strings só funciona com aspas duplas:
name = "Pedro"
"Tudo certo, #{name}?" # Tudo certo, Pedro?
'Tudo certo, #{name}?' # "Tudo certo, \#{name}?"
A interpolação vai ser avaliada apenas uma vez antes de qualquer outra operação
com a string resultante:
12
Casa do Código
Capítulo 2. Conhecendo Ruby
i = 0
"#{i = i + 1} " * 3 # "1 1 1 " e não "1 2 3 "
Há outra maneira mais complexa de fazer interpolação de Strings. Leitores que
conhecem C e Java vão se lembrar da função sprintf ao fazer interpolação com o
operador %. Neste caso, é possível usar aspas simples:
'Custo total: $%.2f' % 100 # Custo total: $100.00
Para a relação completa de como a formatação deste operador funciona,
veja a documentação online:
http://www.ruby-doc.org/core-1.9.3/Kernel.html#
method-i-sprintf .
Acessando caracteres e substrings
Strings, no final das contas, são cadeias de caracteres, como se fossem Arrays.
Portanto, é possível acessar caracteres via método [] com o índice:
a = "hello world"
a[0] # 'h'
a[6] # 'w'
a[-1] # "d" - Valores negativos contam do fim ao começo
a[-2] # "l"
Este acessor leva em conta o encoding atual, portanto, em encodings multibyte,
ou seja, encodings que podem usar mais de um byte para representar um caractere,
o acessor irá retornar o caractere em si e não o byte naquela posição:
# encoding: utf-8
a = "Olá, tudo bom com você?"
puts a[2]
# á
puts a.bytesize
# 25
puts a.length
# 23
Para acessar substrings, usamos um outro tipo de variável, o Range, ou 2 índices
indicando o começo e o fim:
a = "Hello world"
a[6, 10] # => "world"
a[6..10] # => "world"
a[-5..-1] # => "world"
a[-1..-5] # => "" - quando não é possível, o método retorna string vazia.
13
2.3. Tipos e estrutura de dados
Casa do Código
Inteiros e Floats
Inteiros e floats possuem representações literais como em qualquer linguagem:
a = 100
a = 100000000
# Fica difícil ler com muitos zeros
a = 100_000_000 # Pode usar _ para separar e possui o mesmo efeito
a = 100.0
100.0.to_i
# 100 - Conversão de float para inteiro
100.to_f
# 100.0 - Conversão de inteiro para float
Quando se faz operações entre os dois tipos, especialmente divisões, acontece a
coerção de tipos, ou seja, um inteiro é automaticamente convertido para float quando
há um float envolvido na conta.
Quando dividimos um inteiro com outro, o resultado será um inteiro truncado,
removendo-se a parte quebrada, ou seja, remove-se os decimais, e converte-se a um
inteiro. Por exemplo:
100 / 3 # => 33
Para obter um valor real/float, é necessário convertê-lo antes para float:
100.to_f / 3 # => 33.3333333...336
Cuidado com floats!
A representação de números reais usada é o IEEE-754, a forma padrão
de representar números reais em binários, usada não só por Ruby, mas
também por C, Java e JavaScript. Porém, este padrão possui um problema
perigoso de arredondamento:
0.0004 - 0.0003 == 0.0001 #=> false
Este é um problema sério, pois muitas pessoas não conhecem ou não
sabem deste problema e usam floats para valores financeiros, o que é er-
rado. Para isso, usa-se a classe BigDecimal, do conjunto de bibliotecas
padrão do Ruby. Apesar de ser muito mais lenta que floats, eles são pre-
cisos e se tratando de cálculos financeiros, performance geralmente não
é um problema, se comparado com aplicações científicas.
14
Casa do Código
Capítulo 2. Conhecendo Ruby
Constantes
Constantes em Ruby são todas as variáveis que começam com uma letra maiús-
cula, independente do restante. Veja o seguinte exemplo:
Pi = 3.14159
Porém, a comunidade Ruby adota um padrão de nomenclatura. Como classes
e módulos também usam constantes para identificá-los, adotamos CamelCase para