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:
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 |
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.
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.
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