Nós vimos alguns tipos diferentes de objetos (números e letras), e nós fizemos variáveis para apontar para elas; a coisa que queremos fazer a seguir é fazer com que todas se encaixem.
Nós vimos que se desejássemos que um programa imprimisse 25, o código a seguir não funcionaria, porque você não pode somar números e strings:
var1 = 2 var2 = '5' puts var1 + var2
Parte do problema é que seu computador não sabe se você está querendo 7 (2 + 5) ou 25 ('2' + '5').
Antes que possamos somar os dois, precisamos de alguma maneira de obter a versão em string de var1, ou então de obter a versão inteira de var2.
Para obter a versão string de um objeto, simplesmente escrevemos .to_s depois dele:
var1 = 2 var2 = '5' puts var1.to_s + var2
25
Similarmente, to_i fornece a versão inteira de um objeto, e to_f dá a versão float. Vejamos o que esses três método fazem (e não fazem) com mais detalhe:
var1 = 2 var2 = '5' puts var1.to_s + var2 puts var1 + var2.to_i
25 7
Note que, mesmo depois que obtivemos a versão string de var1 por meio de to_s, var1 sempre apontou para 2, e nunca para '2'. A não ser que reatribuamos var1 explicitamente (o que requer um sinal de =), ela vai apontar para 2 enquanto o programa estiver rodando.
Agora vamos tentar algumas conversões mais interessantes (e alguma apenas esquisitas):
puts '15'.to_f puts '99.999'.to_f puts '99.999'.to_i puts '' puts '5 é meu número favorito!'.to_i puts 'Quem foi que te perguntou sobre o 5?'.to_i puts 'Sua mãe.'.to_f puts '' puts 'stringuelingue'.to_s puts 3.to_i
15.0 99.999 99 5 0 0.0 stringuelingue 3
É provável que tenha havido surpresas. A primeira é bem padrão e dá 15. Depois disso, convertemos a string '99.999' para um float e para um inteiro. O float ficou como esperávamos; o inteiro, como sempre, foi arredondado para baixo.
Em seguida temos alguns exemplos de strings... atípicas convertidas em números. to_i ignora a primeira coisa que ela não entende, e o resto da string daquele ponto em diante. Então a primeira string foi convertida para 5, mas as outras, já que começavam com letras, foram ignoradas por completo... então o computador só escolhe zero.
Por fim, vimos que nossas duas últimas conversas não fizeram nada, exatamente como esperávamos.
Há alguma coisa estranha no nosso método favorito... Dê uma olhadinha:
puts 20 puts 20.to_s puts '20'
20 20 20
Por que é que essas três imprimem a mesma coisa? Tudo bem, as duas últimas deveriam mesmo, já que 20.to_s é '20'. Mas e a primeira, o inteiro 20? Falando nisso, faz algum sentido escrever o inteiro 20? Quando você escreve um 2 e depois um 0 num papel, você está escrevendo uma string, não um inteiro. O inteiro 20 é o número de dedos que eu possuo, e não um 2 seguido de um 0.
O nosso amigo puts carrega um grande segredo: antes de tentar escrever um objeto, puts usa to_s para obter a versão string do mesmo. Na verdade, o s em puts está lá representando string; puts na verdade significa put string (colocar string).
Isso pode não parecer muito animador agora, mas há muitos, muitos tipos de objetos em Ruby (você vai até aprender a fazer o seu próprio!), e é bom saber o que vai acontecer se você tentar usar puts num objeto muito estranho, como uma foto da sua avó, ou um arquivo de música ou algo assim. Mas isso vem depois...
Até lá, nós temos mais alguns métodos para você, e eles permitem que escrevamos um bando de programas divertidos...
Se puts significa colocar string (N.T.: put significa "colocar"), acho que você pode adivinhar o que gets quer dizer (N.T.: get, em inglês, entre várias acepções, significa pegar, obter). E assim como puts sempre cospe strings, gets vai apenas obter strings. E de onde ele as pega?
De você! Tudo bem, do seu teclado. Já que seu teclado só produz strings, isso funciona muito bem. O que acontece, na verdade, é que gets fica lá esperando, lendo o que você digita até que você pressione Enter. Vamos experimentar:
puts gets
Tem um eco aqui?
Tem um eco aqui?
Claro, tudo que você digitar vai ser repetido para você. Rode algumas vezes e tente digitar coisas diferentes.
Agora podemos fazer programas interativos! Neste, digite o seu nome para que ele lhe saude:
puts 'Olá, qual é o seu nome?' name = gets puts 'Seu nome é ' + name + '? Que nome bonito!' puts 'Prazer em conhecê-lo, ' + name + '. :)'
Eca! Eu acabei de rodá-lo—escrevi meu nome—e aconteceu isto:
Olá, qual é o seu nome?
Chris
Seu nome é Chris
? Que nome bonito!
Prazer em conhecê-lo, Chris
. :)
Hmmm... parece que quando eu digitei as letras C, h, r, i, s, e pressionei Enter, gets obteve todas as letras do meu nome e o Enter! Felizmente, existe um método exatamente pra esse tipo de coisa: chomp. Ele retira qualquer Enter que esteja lá de bobeira no fim da sua string. Vamos testar aquele programa de novo, mas com chomp para ajudar:
puts 'Olá, qual é o seu nome?' name = gets.chomp puts 'Seu nome é ' + name + '? Que nome bonito!' puts 'Prazer em conhecê-lo, ' + name + '. :)'
Olá, qual é o seu nome?
Chris
Seu nome é Chris? Que nome bonito!
Prazer em conhecê-lo, Chris. :)
Muito melhor! Perceba que já que name aponta para gets.chomp, não temos que dizer name.chomp; name já foi mastigado (N.T.: chomp, em Inglês é "mastigar").
• Escreva um programa que peça o nome de uma pessoa, depois o sobrenome. Por fim, faça com que ele cumprimente a pessoa usando seu nome completo.
• Escreva um programa que pergunte pelo número favorito de uma pessoa. Some um ao número, e sugira o resultado como um número favorito muito melhor (tenha tato ao fazê-lo).
Assim que você terminar esses dois programas (e quaisquer outros que você queira tentar), aprenderemos mais métodos (e mais coisas sobre eles).
© 2003-2015 Chris Pine