Números em Ruby

Vamos brincar com números. Em Ruby, números sem pontos decimais são chamados inteiros (integers), e números com pontos decimais são geralmente chamados de números em ponto flutuante (floating-point numbers) ou, mais simples, floats (você deve inserir pelo menos um dígito depois do ponto decimal). Um literal inteiro é uma sequência simples de dígitos ex.: 0, 123, 123456789. Underscores podem ser inseridos em literais inteiros (embora não no começo ou no final), e essa característica é utilizada algumas vezes como separador de casa de milhar ex. 1_000_000_000. Caracteres do tip ounderscore são ignorados no dígito de string. Aqui está o programa p002numerosruby.rb

 1 # p002numerosruby.rb
 2 =begin
 3  Números Ruby
 4  Operadores comuns:
 5  + adição
 6  - subtração
 7  * multiplicação
 8  / divisão
 9 =end
10 
11 puts 1 + 2
12 puts 2 * 3
13 # Divisão de inteiros
14 # Quando você faz um cálculo aritmético com inteiros,
15 # você receberá uma resposta em inteiros
16 puts 3 / 2
17 puts 10 - 11
18 puts 1.5 / 2.6

Inteiros Ruby são objetos da classe Fixnum ou Bignum. As classes Fixnum e Bignum representam inteiros de diferentes tamanhos. Ambas as classes descendem de Integer (e, sendo assim, de Numeric). Os números em ponto flutuantes são objetos da classe Float, correspondendo a arquitetura nativa do tipo de dados double. As classes Complex, BigDecimal e Rational não são embutidas no Ruby mas são distribuídas com ele como parte das bibliotecas padrões. Nós falaremos sobre classes em detalhes mais tarde.

A hierarquia das classes (cortesia: Donald Craig) é como a mostrada na figura abaixo:

Operadores e precedência

Vamos dar uma olhada nos operadores do Ruby (cortesia: Dave Thomas – Programming Ruby). Eles estão organizados aqui em ordem de precedência, da mais alta para a mais baixa.

Método Operador Descrição
Sim [] []= Referência a um elemento, conjunto de elementos
Sim ** Exponenciação
Sim ! ~ + – Não (negação), complemento, mais e menos unários (os nomes de métodos para os dois últimos são +@ e -@)
Sim * / % Multiplicação, divisão e módulo
Sim >> << Deslocamento para direita e esquerda
Sim & “E” (bitwise par inteiros)
Sim ^ “Ou” exclusivo e “ou” comum (bitwise par inteiros)
Sim <= < > >= Operadores de comparação
Sim <= < > >= Igualdade e operadores para casamento de padrões (!= e !~ não podem ser definidos como métodos)
&& “E” lógico
“Ou” lógico
.. … Intervalos inclusivo e exclusivo
?: Operador ternário (If-then-else)
= %= /= -= += = &= >>= <<= = &&= = *= Operadores de atribuição
defined? Checa se um símbolo foi definido
not Negação lógica
or and Composição lógica
if unless while until Modificadores de expressão
begin/end Expressão de blocos
  1. Os operadores de incremento e decremento (++ e —) não estão disponíveis em Ruby, nem da forma “pré” nem “pós”. Entretanto, note que os operadores += e -= estão disponíveis.
  2. Parênteses funcionam da mesma forma como em expressões aritméticas. Qualquer coisa dentro de parênteses é calculado primeiro (ou, de uma forma mais técnica, é dado uma precedência maior).
  3. Os operadores checados na figura são um tipo de syntactic sugar (“açúcar sintático”, mais sobre isso depois) – onde algo parece com um operador mas na verdade é uma chamada a um método.

O operador módulo (%) do Ruby se comporta da seguinte forma:

1 puts (5 % 3)     # imprime  2
2 puts (-5 % 3)    # imprime  1
3 puts (5 % -3)    # imprime -1
4 puts (-5 % -3)   # imprime -2

A definição do operador módulo do Ruby é diferente do C e do Java. Em Ruby, a operação -7 % 3 retorna 2. Já em Java e C, o resultado é -1. Em Ruby, o sinal do resultado (para o operador %) é sempre o mesmo sinal do segundo operando.

Diferença entre os operadores or e ||

Ambos, or e ||, retornam o primeiro argumento ao menos que este retorne false, neste caso avaliam e retornam o segundo argumento. Isto é demonstrado no exemplo seguinte:

1 puts nil || 2008
2 puts false || 2008
3 puts "ruby" || 2008

A saída é:

1 >ruby test.rb
2 2008
3 2008
4 ruby
5 >Exit code: 0

A única diferença entre or e || é sua precedência. || tem uma precedência mais alta do que or.

Uma prática comum é usar || para atribuir valor a uma variável somente se nenhum valor foi atribuído a ela. Isso pode ser escrito assim:

1 @variavel = @variavel || "valor padrão"

ou, mais idiomático, como:

1 @variavel ||= "valor padrão"

Uma razão para essas versões alternativas de operadores booleanos é o fato de que eles têm precedência mais baixa do que o operador de atribuição. Isto significa que você pode escrever uma expressão booleana como a seguinte que atribui valores à variáveis até que ele encontre um valor false:

1 if a = f(x) and b = f(y) and c = f(z) then d = g(a,b,c) end

Esta expressão simplesmente não funcionaria se escrita com && ao invés de and.

Logo do Guru-SP

Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.

Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto

Voltar para o índice