3.Manipulando e Verificando Dados
Começaremos agora a colocar em prática o pouco que aprendemos.
No decorrer do capítulo aprenderemos alguns métodos de Ruby utilizados para verificar valores; comentários; e conheceremos as palavras que a linguagem Ruby reserva para si.
Palavras Reservadas
A seguir a lista de palavras reservadas, ou seja, palavras que Ruby reserva para si e portanto não podem ser usadas para dar nome ao outro objeto.
BEGIN class ensure nil self when
END def false not super while
alias defined for or then yield
and do if redo true
begin else in rescue undef
break elsif module restry unless
case end next return until
Comentários
Comentários são trechos de código que não interferem na execução do programa, então podemos usá-los para fazer anotações em trechos do programa quando precisamos dar atenção especial àquele trecho ou simplesmente para descrever o que o mesmo faz. Esse recurso é muito útil e ajuda muito a organizar o programa, e também ajuda a relembrar o “porquê daquela linha”, por exemplo, imagine que estava desenvolvendo um programa e por algum motivo teve que parar por um bom tempo, se deixou comentário em seu código será mais fácil de relembrar o que cada coisa faz.
Para comentar uma linha do código, coloque
# antes da mesma. Lembre-se esse tipo de comentário é válido para apenas
uma linha. Exemplo:
OBS: Perceba ao escrever no editor de scripts do RPGMaker, o texto fica colorido conforme a sintaxe. No caso, uma linha comentada recebe a coloração verde como na imagem acima. Isso acontece com outras partes da sintaxe também, como por exemplo, palavras reservadas ficam em azul.
Existe também um comando para comentários
multi-linhas, usada para fazer comentários longos(com várias linhas). Mas este comando não é usada apenas para isso, também serve para
documentação embutida pela ferramenta
rdtool, mas isso não será abordado(talvez futuramente).
O comando é composto por
delimitadores, um para indicar o início e outro para o fim, são eles
=begin e
=end, respectivamente. O que estive escrito entre esses delimitadores será considerado comentário e não irão interferir do programa. Mas existem alguns cuidados a tomar. É obrigatório escrever o delimitador no início da linha(
colado no início da linha), e para cada =begin tem que existir um =end, lembrando que se ao colocar =begin dentro de um outro comentário também o torna um comentário. Exemplo:
OBS: escrever qualquer coisa com exceção da palavra =end no início, pois isso encerraria o comentário.
print( ) puts( ) p( )
Bom, até agora usamos o método
printvárias vezes. O que o método fez foi nos mostrar em uma
message box o valor de uma variável, ou até mesmo um dado escrito diretamente(sem precisar de variável). E é isso mesmo que ele faz, assim como o método
p( ). Veja os exemplos
Embora com ou sem parênteses funcione, é recomendável utilizá-los
Já o método
puts( ), não dos mostra a janela com o valor. Bom normalmente os métodos
print( ) e
p( ) , do ruby, também não, mas com modificações feitas neles pelo RGSS os valores são exibidos na janela. Também é possível alterar o método puts( ) de ruby para mostrar a mensagem em uma janela, mas não veremos isso agora para não “embolar” a cabeça de ninguém. Resumindo estes três métodos nos retorna o valor empregado como argumento(o valor dentro do parênteses ou na frente do método) à eles na saída padrão, mas que pode ser alterada para uma message box por exemplo.
Operadores
Os operadores são utilizados para manipular os dados , por exemplo, construir expressões matemáticas, operações lógicas, comparar valores, etc. É essencial o uso destes para construir nosso programas e portanto
Operadores aritméticosVeremos a seguir
operadores aritméticos e suas funções.
Operador | Função | Exemplo | Retorno |
+ | Adição | 1+1 | 2 |
- | Subtração | 1-1 | 0 |
* | Multiplicação | 1*1 | 1 |
/ | Divisão | 1/1 | 1 |
% | Resto da Divisão | 1%1 | 0 |
+ | Mais(unário) | +1 | 1 |
- | Menos(unário) | -(1) | -1 |
** | Exponenciação | 2**3 | 8 |
Atente para as coluna “Exemplo" e "Retorno”, ela mostra exemplos do que o operador faz, onde "Exemplo" é a expressão utilizando o operador em questão, e "Retorno" é o resultado da expressão, ou seja, o valor que será
retornado pela expressão, e que podemos usá-lo de imediato ou
*armazená-lo em uma variável para uso posterior.
*A partir deste ponto sempre irei colocar, em relação a variável, como
armazenar informação na variável e não
fazer referência como anteriormente, pois a explicação do capítulo 2 sobre variáveis foi para fins didáticos e após ter entendido não é preciso ficar se referindo desta forma à função de uma variável, assim facilitamos o trabalho daqui em diante.
Os operadores anteriormente mostrados são operadores aritméticos, para expressões matemáticas,
mas o operador “+” pode ser usado na concatenação de strings também.
O código acima abrirá uma janela do Windows com os três trechos juntos escritos.
Operadores relacionaisAgora uma tabela com alguns
operadores relacionais, eles servem para comparar valores. Lembre-se aí não estão todos.
Operador | Função |
> | Maior que |
>= | Maior que ou igual a |
< | Menor que |
<= | Menor que ou igual a |
!= | Diferente de |
== | Diferente de |
Exemplos:
Repare que todos retornam valores booleanos(TrueClass ou FalseClass).
Operadores condicionais ou lógicosOperador | Função |
and | “e” lógico/condicional |
&& | “e” lógico/condicional |
or | “ou” lógico/condicional |
|| | “ou” lógico/condicional |
not | Negação |
& | “e” |
| | “ou” |
^ | “ou exclusivo” | ! | Negação |
Não é necessário usá-los em conjunto com operadores relacionais, embora sejam comumente usados.
São conhecidos como operadores condicionais porque impõem uma condição para o retorno, onde cada operador tem uma condição diferente.
and :Este operador avalia duas expressões, uma que o precede e a que vem a frente do
and, e verifica se as duas expressões retornam
true para então a operação retorna true
também, se pelo menos uma das expressões retornar
false, a operação também retornará false independente da outra expressão retornar true ou false.Exemplos:
[img width=437 height=500]
https://2img.net/r/ihimizer/img686/1828/img5cap3.jpg[/img]*Perceba que foram necessários parênteses no código, sem eles não seria possível ver o verdadeiro efeito do operador direto como foi feito.
&& :Tem o mesmo efeito do operador
and.
or :Avalia duas expressões da mesma forma que o operador
and, porem este verifica se a primeira expressão
ou a segunda expressão tem valor
true para o operador poder retornar
true, ou seja, pelo menos uma das expressões tem que ser verdadeira para a operação retornar true, consequentemente, se nenhuma das expressões forem true a operação retornará
false. Exemplos:
[img width=430 height=500]
https://2img.net/r/ihimizer/img163/928/img6cap3.jpg[/img]*Perceba que foram necessários parênteses no código, sem eles não seria possível ver o verdadeiro efeito do operador direto como foi feito.
|| :Tem o mesmo efeito do operador
or.
not :Este operador avalia apenas uma expressão. Como descrito na função, ele é um operador de
negação, portanto ele nega o valor, e essa negação é simplemente uma inversão do valor, ou seja, se o valor for
true será invertido para
false, e se for
false será invertido para
true. Exemplos:
*Perceba que foram necessários parênteses no código, sem eles não seria possível ver o verdadeiro efeito do operador direto como foi feito.
! :Tem o mesmo efeito do operador
not.
& :Este é um pouco mais complicado. Quando se trabalha apenas com lógica(true ou false) o operador tem a mesma função do
&&. Veja os exemplos:
Ao trabalhar com números, as coisas mudam um pouco. Primeiro os números envolvidos na operação são
transformados em números binários para o operador iniciar uma operação lógica do tipo
and bit a bit, ou seja, vai verificar aplicar a lógica
and comparando cada dígito do número para formular uma resposta de retorno que será transformada para decimal novamente. Exemplos:
Antes de iniciar a análise dos exemplos, devo citar que é preciso ter em mente que um número em binário é apresentado apenas pelos números 0 e 1, e que para efeito de calculo, considere 1 como true e 0 como false, isso para facilitar o entendimento do operação and bit a bit.*OBS: O bit pode ser encarado como o número de dígitos do número binário.
*OBS: Conversões de decimal para binário e vice-versa são necessárias porque a
linguagem que a máquina utiliza é diferente da
humana, e usa um outro sistema numérico conhecido como binário que utiliza apenas de 0 e 1 para construção de seus números. Então a comunicação homem-máquina-homem com maior facilidade implica nestas conversões.
Vamos analisar a primeira operação. Primeiro os números foram transformados de decimais para binários:
Em seguida é feita a operação lógica
and bit a bit:
1111 and 0001 => 1111
0001
-------
0001
O resultado agora é convertido para decimal novamente e impresso na janela gerada pelo comando printpara podermos ver o valor de retorno:
Ao testar o código verá que será exatamente
1 o valor retornado.
Agora demonstrando o segundo exemplo:
Primeiro os números foram transformados de decimais para binários:
DECIMAL | BINÁRIO |
11 | 1011 |
14 | 1110 |
Em seguida é feita a operação lógica
and bit a bit:
1011 and 1110 => 1011
1110
-------
1010
O resultado agora é convertido para decimal novamente e impresso na janela gerada pelo comando print para podermos ver o valor de retorno:
Ao testar o código verá que será exatamente
10 o valor retornado.
*OBS: Escrever
0001 ao invés de escrever apenas
1, foi apenas uma forma mais simples de explicar.
Mesmo hoje em dia ser muito fácil encontrar calculadoras que façam essas conversões para você(geralmente qualquer computador vem com um software de uma calculadora do tipo), seria legal como é feita estas conversões na
mão.
DECIMAL para BINÁRIOSimplesmente deve dividir o número que deseja converter para binário, dividendo, por
2(porque que números binários são de base 2, lembre-se BI=2), divisor, não se importando com o
resto da divisão(o resto será 1 quando existir) caso exista(ele será usado depois), evitando assim números com vírgula. O resultado da divisão(quociente) será o nosso novo dividendo desde que ele não valha
1. Este processo deve ser repetido até o quociente valer
1. Então é preciso juntar o valor deste quociente final que sempre será 1 com os valores de
resto das divisões anteriores, seguindo da última para a primeira. Uma ilustração para ajudar a entender:
BINÁRIO para DECIMALPara essa conversão é preciso conhecer exponenciação. Primeiro um exemplo em seguida um explicação, será melhor fazer desta forma para explicar:
*OBS: o sinal ** representa elevar a uma potencia, portando, 2**2 é o mesmo que 2², ou 2 elevado a 2.Passando 1111 para decimal:
1 x 2**3 + 1 x 2**2 + 1 x 2**1 + 1 x 2**0 = 15Passando 1110 para decimal:
1 x 2**3 + 1 x 2**2 + 1 x 2**1 + 0 x 2**0 = 15Pelos exemplo acima, é possível perceber que é somado o valor resultante de cada bit, e o valor de cada bit muda conforme sua “posição”(qual digito) no número, da mesma forma que no sistema decimal o primeiro digito vale unidades, o segundo dezenas, terceiro centenas, etc. Só com os números binários o primeiro digito
vale 2 elevado a 0, o segundo 2 elevado a 1, o terceiro 2 elevado a 2, e assim segue.Assim como nos decimais,
0(zero) dezenas significa que não tem dezenas, nos binários o bit 0 significa que não tem aquele digito, então não vamos incluí-lo no cálculo, para isso bastou multiplicar por
0(zero) o valor da potencia resultante da casa em questão.
Isso é o básico sobre a conversão entre estes dois tipos, ainda existem alguns detalhes com relação a conversão do número quando
há virgula. Para não continuar a prolongar está explicação que foge um pouco do assunto em questão é melhor que os interessados em saber mais sobre essas conversões tentem
“andar por suas próprias pernas“, pesquisando por conta própria, ou até mesmo, para os mais empolgados, tentar descobrir sozinho apenas analisando o que já foi passado.
Continuando com o
operador &, não utilize para trabalhar diretamente com objetos do
tipo string, pois isso ocasionará erros.
Existe uma situação onde este operador age diferente das situações anteriormente vistas. Quando está trabalhando com objetos do tipo
array.
Nessa situação, ele busca a
intersecção entre as duas arrays avaliadas, ou seja, valores em comum entre elas. Então não importa o tipo de objetos armazenados nessa array já que o operador não precisa “mexer“ nestes valores.
Ao final, o operador retorna como resposta uma array com os valores em comum entre as duas arrays avaliadas, organizadas conforme os valores estão organizados na primeira array da operação e sem repetir valores iguais mesmo que exista a repetição do mesmo valor várias vezes nas duas arrays avaliadas. Se não houver valores em comum a função retorna uma
array vazia. Exemplos:
Na imagem do código acima foi colocado na frente de cada operação um comentário seguido do valor que será retornado(como vem sendo feito em todos exemplos), mas é importante ressaltar que o valor retornado é um
array carregada com os valores citados(isso ajuda a explicar o porque do “13“, por exemplo, que na verdade é “1” e “3”).
| :Funciona da mesma forma que o operador
&, porém, ao invés de fazer a operação lógica
and executa-se a operação
or, tanto para o
bit a bit, como para valores lógicos(true e false), tanto para arrays. Exemplos:
Perceba como o resultado é idêntico ao resultado dos exemplo com operador
or(||).
O procedimento é idêntico ao do operador
&, porém, a operação bit a bit usou a lógica
or ao invés de
and. Veja:
1110 or 0011 => 1110
0011
------
1111
Ao trabalhar com arrays, ao contrario do operador & que buscava a intersecção entre as arrays, o operador “|” busca a união entre elas, formando uma nova array seguindo as mesmas regras de organização do operador &: ordem em que aparecem os valores da primeira array da operação; sem valores repetidos mesmo que hajam vários iguais nas duas arrays; o valor retornado é um array com os valores dos dois operandos. Caso a array
retorne vazia, significa que não existem valores em nenhuma das arrays da operação(nil).
*OBS: também não é possível operar valores do tipo string com este operador.
^ :Funciona da mesma forma que os operadores
& e
|, porém, executa-se a operação lógica conhecida como
ou exclusivo, tanto para o
bit a bit, como para valores lógicos(true e false).
O operador ou exclusivo, quando usado com valores lógicos(true e false), retorna verdadeiro quando as duas expressões avaliadas forem diferentes(uma true e a outra false), e retorna false quando as duas expressões são iguais(as duas são true ou as duas são false). Exemplos:
Para a operação bit a bit, assim como foi visto anteriormente, considere nos números binários “0” como false e “1” como true para a comparação bit a bit da operação com números, seguindo aquele mesmo processo dos anteriores.
Resolução:
1110 ou exlusivo 0011 => 1110
0011
------
1101
*OBS: também não é possível operar valores do tipo string com este operador.
*OBS:
não é possível operar arrays com este operador. Operadores de deslocamentoOperador | Função |
>> | Desloca bits a direita |
<< | Desloca bits a esquerda |
Eles servem para
deslocamento de bits. Assim como os operadores bit a bit vistos anteriormente, estes também necessitam de conhecimento sobre binário e decimal.
O operador “>>“ avalia duas expressões, uma que o precede e outra logo em seguida do operador(EX: A>>B). Onde B é o número de bits que serão
deslocados a direita em A, isso significa que B representa quantos dígitos serão “empurrados” para fora do número em binário. Exemplo:
O que aconteceu foi o seguinte:
Simplesmente é isso o que é feito. Lembre-se, este operador só funciona com dados do tipo
Integer(números inteiros).
O operador “<<“ também avalia duas expressões, uma que o precede e outra logo em seguida do operador(EX: A>>B). Onde B é o número de bits que serão
deslocados a esquerda em A, isso significa que B representa quantos dígitos serão “adicionados” ao número em binário(
os bits adicionados tem valor “0“). Exemplo:
O que aconteceu foi o seguinte:
Simplesmente é isso o que é feito. Lembre-se, este operador só funciona com dados do tipo
Integer(números inteiros).
[size=12pt]
Operadores de Atribuição[/size]
O principal operador de atribuição é o “=“, ele serve para atribuir valor a um objeto.
Para entender os outros operadores é preciso entender este, que por sinal é muito simples. Já vimos ele em funcionamento no capítulo 2 quando atribuímos valores as nossas variáveis. É importan ressaltar que o operador = não é a mesma coisa que o sinal = que usamos na matemática, este ultimo diz que duas coisas são iguais, já aqui nosso operador, de forma curta e grossa, diz para a expressão da esquerda ter o valor da expressão da direita. Exemplos:
Dando atenção especial para a linha:
var = var + 2
Podemos começar a entender os outros operadores de atribuição.
O que acontece é que o novo valor da variável
var é igual a “
var + 2”.
E existe uma operador equivalente a isto, o operador “+=“, veja como ficaria o exemplo acima utilizando este operador:
var += 2
O resultado será o mesmo. O único cuidado que deve ser tomado é a certeza do objeto
var ser do tipo que o operador funcione.
A tabela a seguir mostra vários operadores seguem a mesma linha, a diferença está na operação que eles executam:
Exemplo | Equivalente |
var += 2 | var = var + 2 |
var -= 2 | var = var - 2 |
var *= 2 | var = var * 2 |
var /= 2 | var = var / 2 |
var %= 2 | var = var % 2 |
var **= 2 | var = var ** 2 |
var &= 2 | var = var & 2 |
var &&= 2 | var = var && 2 |
var |= 2 | var = var | 2 |
var ||= 2 | var = var || 2 |
var >>= 2 | var = var >> 2 |
var <<= 2 | var = var << 2 |
Comentários:Os códigos estão sendo escritos no editor de scripts do RPGMakerXP e em seguida é tirado uma screenshot do código para servir de exemplos na apostila, ou seja, sendo uma imagem o leitor não poderá copiar os códigos para testar os exemplo. A idéia e fazer com que o leitor escreva ele mesmo os códigos ao invés de apenas copiar e colar. A partir do próximo capítulo os códigos começaram a ser escritos, pois a esta altura o programador já deve ter se familiarizado um pouco com o editor e percebido que as vezes quando estamos escrevendo acabamos errando e isso interfere em nosso programa, desta forma aprendeu como corrigir alguns erros.
Agradecimentos:zecomeia
livro “Ruby: Investigando a Linguagem” por Ivan Mecenas (Editora Alta Books)