rubyacademy

 

MixingItUp

Page history last edited by g 3 yrs ago

Mescoliamoli insieme

 

Finora abbiamo visto alcuni differenti tipi di oggetti (numeri e lettere), e abbiamo creato delle variabili che puntano ad essi; la prossima cosa che faremo sarà quella prenderli e di metterli allegramente insieme.

 

Abbiamo visto che se vogliamo far stampare 25 al nostro programma, il seguente programma non va bene, poiché non si possono sommare numeri e stringhe:

 

var1 = 2

var2 = '5'

 

puts var1 + var2

 

Parte del problema sta nel fatto che il computer non sa se vogliamo ottenere 7 (2 + 5) oppure 25 ('2' + '5').

 

Prima di poterli sommare abbiamo bisogno di rappresentare var1 come stringa oppure var2 come intero.

 

Conversioni

 

Per ottenere la versione stringa di un oggetto, basta aggiungere .to_s dopo di esso:

 

var1 = 2

var2 = '5'

 

puts var1.to_s + var2

25

 

Allo stesso modo to_i ci fornisce l'oggetto sotto forma di intero, e to_f ci da invece la versione decimale. Vediamo un po' più da vicino cosa fanno (e cosa non fanno) questi tre metodi:

 

var1 = 2

var2 = '5'

 

puts var1.to_s + var2

puts var1 + var2.to_i

25

7

 

Si può notare che anche dopo aver convertito var1 in stringa, chiamando to_s, questi punta sempre a 2 e mai a '2'. A meno che non sia esplicitamente riassegnato (il che richiede il segno =) var1 punterà a 2 in tutto il programma.

 

Adesso proviamo alcune interessanti (a volte un po' strane) conversioni:

 

puts '15'.to_f

puts '99.999'.to_f

puts '99.999'.to_i

puts ''

puts '5 is my favorite number!'.to_i

puts 'Who asked you about 5 or whatever?'.to_i

puts 'Your momma did.'.to_f

puts ''

puts 'stringy'.to_s

puts 3.to_i

15.0

99.999

99

 

5

0

0.0

 

stringy

3

 

Probabilmente, alcune di queste conversioni sorprendono un po'. La prima è abbastanza standard e ci da 15.0. Poi abbiamo convertito la stringa '99.999' in decimale e in intero. Il decimale fa quello che ci si aspetta; l'intero, come al solito, è arrotondato.

 

E ancora, seguono alcuni esempi di... insolite stringhe convertite in numeri. to_i ignora la prima cosa che non capisce, e anche il resto della stringa da quel punto in poi. Così la prima stringa è convertita in 5, ma le altre, che iniziano con una lettera, sono ignorate completamente... e il computer mostra solo uno zero.

 

Infine, le ultime due conversioni non fanno assolutamente niente, proprio come ci si aspetta.

 

Un altro sguardo a puts

Ci sono strani comportamenti del nostro metodo preferito... Date uno sguardo a questo:

 

puts 20

puts 20.to_s

puts '20'

20

20

20

 

Perché in tutti e tre i casi viene stampata la stessa cosa? Bene, sugli ultimi due nessuna stranezza, poiché 20.to_s è '20'. Ma perché succede anche con il primo, l'intero 20? For that matter, what does it even mean to write out the integer 20? Quando scriviamo un 2 e poi uno 0 su un pezzo di carta, noi stiamo scrivendo una stringa, non un intero. L'intero 20 è il numero di dita delle mani e dei piedi che io ho; non è un 2 seguito da uno 0.

 

Bene, qui c'è il grande segreto del nostro amico puts: Prima di scrivere un oggetto puts utilizza to_s per ottenere l'oggetto sotto forma di stringa. Infatti, la s in puts sta per stringa; puts dunque significa put string.

 

Questo potrebbe sembrare non molto entusiasmante adesso, ma in Ruby ci sono tantissimi tipi di oggetti (impareremo anche come crearne di nostri!), ed è divertente sapere cosa accade quando tentiamo di usare puts su un oggetto veramente molto strano, come ad esempio un'immagine di nostar nonna, o un file musicale o qualcos'altro. Ma questo lo vedremo dopo...

 

Nel frattempo, vediamo alcuni metodi che si permetteranno di scrivere ogni genere di programma...

 

 

I metodi gets e chomp

Se puts significa put string, sono sicuro che potete indovinare il significato di gets. Poiché puts tira fuori delle stringhe, allora gets sarà in grado di recuperare delle stringhe. E da dove le otterrà?

 

Da noi! Dalla nostra tastiera ovviamente. Poiché la nostra tastiera produce solo stringhe, tutto funziona a meraviglia. Quello che accade è che gets se ne sta in attesa di leggere quello che scriviamo fino a che non premiamo il tasto Enter. Proviamo:

 

puts gets

C'è eco qui?

C'è eco qui?

 

Ovviamente qualsiasi cosa scriviamo sarà ripetuta. Provate ad eseguirlo più volte e a scrivere cose differenti.

 

A questo punto siamo pronti per fare un programma interattivo! Scriveremo il nostro nome e il programma ci saluterà:

 

puts 'Salve, qual\'è il tuo nome ?'

nome = gets

puts 'Il tuo nome è ' + nome + '? Che bel nome!'

puts 'Piacere di conoscerti, ' + nome + '. :)'

 

Eek! Lo eseguiamo scriviamo il nostro nome e questo è quello che accade:

 

Salve, qual'è il tuo nome?

Chris

Il tuo nome è Chris

? Che bel nome!

Piacere di conoscerti, Chris

. :)

 

Hmmm... sembra come se quando ho scritto le lettere C, h, r, i, s, e premuto Enter, gets ha preso tutte le lettere del mio nome e anche Enter! Fortunatamente, c'è un metodo proprio per questo tipo di cose: chomp che toglie ogni Enter dalla fine delle nostre stringhe. Proviamo ancora, ma stavolta ci faremo aiutare da chomp:

 

puts 'Salve, qual\'è il tuo nome ?'

nome = gets.chomp

puts 'Il tuo nome è ' + nome + '? Che bel nome!'

puts 'Piacere di conoscerti, ' + nome + '. :)'

Salve, qual'è il tuo nome?

Chris

Il tuo nome è Chris? Che bel nome!

Piacere di conoscerti, Chris. :)

 

Molto meglio! Notate che nome sta puntando a gets.chomp, quindi non dovremo più fare nome.chomp, poiché il nome è già chompato.

 

 

Alcune cose da provare

  • Scrivere un programma che chiede il nome, il secondo nome e il cognome di una persona. E infine dovrebbe salutare la persona usando il nome completo.

 

  • Scrivere un programma che chiede ad una persona il suo numero preferito. Quindi il programma aggiunge uno al numero e lo suggerisce come un migliore e più grande numero preferito. (Abbiate molto tatto a tale proposito.)

 

Una volta finiti questi due programmi (e qualsiasi altro vogliate fare), impareremo qualche altro metodo e qualcosa di più sui metodi in generale.

Comments (0)

You don't have permission to comment on this page.