Mischiamo Tutto Assieme

Abbiamo esaminato alcuni diversi tipi di oggetti (i numeri e le lettere'), e abbiamo definito delle variabili per puntare ad essi; La prossima cosa da fare è far giocare tutto assieme.

Abbiamo visto che, se vogliamo che un programmi stampi 25, il seguente codice non funziona, perché non si possono sommare numeri e stringhe assieme:

var1 = 2
var2 = '5'
puts var1 + var2

Parte del problema è che il tuo computer non sa se stai cercando di ottenere come risultato 7 (25), o se stai cercando di ottenere 25 ('2' + '5').

Prima di poter sommare questi aggetti assieme abbiamo bisogno di un modo per ottenere la versione in stringa di var1, o di ottenere la versione numerica (integer) di var2.

Conversioni

Per ottenere la versione in stringa di un oggetto, scriviamo semplicemente .to_s dopo di esso:

var1 = 2
var2 = '5'

puts var1.to_s + var2
25

Analogamente, to_i restituisce la versione numerica (integer) di un oggetto, mentre to_f ne restituisce la versione in virgola mobile (float). Proviamo a esaminare cosa fanno (e non fanno) questi metodi più da vicino:

var1 = 2
var2 = '5'

puts var1.to_s + var2
puts var1 + var2.to_i
25
7

Nota che, anche dopo aver ottenuto la versione in stringa di var1 chiamando to_s, var1 stava comunque puntando a 2, e mai a '2'. A meno che non riassegnamo esplicitamente var1 (il che richiede un operatore =), continuerà a puntare a 2 per tutta la durata del programma

Ora proviamo alcune conversioni più interessanti (e anche un po' più strane):

# encoding: utf-8
puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts ''
puts '5 è il mio numero preferito!'.to_i
puts 'E chissenefrega del 5 ce l\'hai aggiunto?'.to_i
puts 'Ce l\'ha aggiunto tua mamma.'.to_f
puts ''
puts 'stringhetta'.to_s
puts 3.to_i
15.0
99.999
99

5
0
0.0

stringhetta
3

Dunque, questo ti ha probabilmente regalato alcune sorprese. La prima è abbastanza scontata essendo 15.0 la versione in virgola mobile (float) di 15. Dopodiché abbiamo convertito la stringa '99.999' in un float e in un intero. Il float era quello che ci aspettavamo; l'integer invece è stato, come sempre, arrotondato per difetto.

Poi ci sono stati alcuni esempi di alcune... insolite stringhe convertite in numeri. E' importante capire che to_i ignora la prima cosa che non capisce, e il resto della stringa da quel punto in poi. Così la prima stringa è stata convertita in un 5, mentre le altre, siccome cominciavano con lettere, sono state ignorate completamente... così il computer sceglie semplicemente zero.

Infine, abbiamo visto che le nostre ultime due conversioni non hanno fatto proprio nulla, proprio come ci saremmo aspettati (abbiamo convertito una stringa in una stringa e un numero intero in un numero intero). [NdT: "integer" in inglese significa "numero intero"]

Un'altra Occhiata a puts

C'è qualcosa di strano circa il nostro metodo preferito... Dai un'occhiata a questo:

puts 20
puts 20.to_s
puts '20'
20
20
20

Perché tutte e queste tre linee di codice stampano la stessa cosa? Bene, le ultime due non sorprendono, dal momento che 20.to_s è '20'. Ma cosa accade con la prima, il numero intero 20? Del resto, che cosa vuol dire esattamente scrivere il numero intero 20? Quando scrivi 2 e poi uno 0 su un pezzo di carta, stai in realtà scrivendo una stringa, non un numero intero. Il numero intero 20 è il numero di dita delle mani e dei piedi che ho; non è un 2 seguito da uno 0!

Bene, ecco il grande segreto dietro al nostro amico puts: Prima che puts cerchi di scrivere (stampare a schermo) un oggetto, questi chiama sempre il metodo to_s per ottenere la versione in stringa dell'oggetto considerato. Infatti la s in puts sta proprio per string; puts in realtà significa put string (NdT: cioé "esponi stringa").

Questo adesso può non sembrare così eccitante, ma ci sono molti, molti tipi di oggetti in Ruby (e imparerai perfino come crearne di tuoi!), e quindi è bene sapere cosa accadrà quando proverai a putsare un oggetto veramente strano, come la foto di tua nonna,

Nel frattempo, ci sono alcuni metodi di cui fare la conoscenza e che ci permetteranno di scrivere ogni tipo di divertente programmino...

I metodi gets e chomp

Se puts significa dunque put string (esponi stringa), Sono sicuro che puoi immaginare cosa significhi gets (NdT: "get string" ↔ "ottieni stringa"). Ed esattamente come puts sputa fuori sempre e solo delle stringhe, allo stesso modo gets recupererà sempre e solo delle stringhe. Ma la domanda è: da dove diamine le recupera?

Ma da te! Naturalmente. Beh, dalla tua tastiera, per la precisione. Dal momento che la tua tastiera può solo generare delle stringhe, la cosa funziona meravigliosamente. Quello che accade veramente è che gets quando viene eseguito di siede lì e legge tutto quello che digiti finché non premi il tasto Enter (Invio). Proviamolo subito:

# encoding: utf-8
puts gets
Senti anche tu un'eco qui?
Senti anche tu un'eco qui?

Ovviamente, qualsiasi cosa tu scriva ti sarà semplicemente ripetuta. Prova a eseguirlo un po' di volte e a scrivere un po' di cose diverse.

Aspetta un momento... il fatto che ora possiamo leggere valori da tastiera significa che possiamo finalmente realizzare dei programmi interattivi! Nel seguente scrivi il tuo nome per farti salutare come si deve:

# encoding: utf-8
puts 'Ehilà, come ti chiami?'
nome = gets
puts 'Ti chiami ' + nome + '? Ma che bel nome!'
puts 'Piacere di conoscerti, ' + nome + '.  :)'

Eeek! L'ho appena eseguito—Ho scritto il mio nome, ed ecco cos'è accaduto:

Ehilà, come ti chiami?
Chris
Ti chiami Chris
?  Ma che bel nome!
Piacere di conoscerti, Chris
.  :)

Uhm... sembra proprio che quando ho digitato le lettere C, h, r, i, s, e poi ho premuto Invio, gets ha ottenuto tutte le lettere del mio nome e l'Invio! Fortunatamente, esiste un metodo proprio per questi casi: chomp. (NdT: in inglese "chomp" è un suono onomatopeico che in italiano si tradurrebbe con "gnam", ma essendo il nome di un metodo nativo di Ruby non si può tradurre). Il metodo chomp taglia ogni Invio che dovesse essere rimasto appeso alla fine della tua stringa. Proviamo di nuovo quel programma, mq questa volta con chomp ad aiutarci:

# encoding: utf-8
puts 'Ehilà, come ti chiami?'
nome = gets.chomp
puts 'Ti chiami ' + nome + '? Ma che bel nome!'
puts 'Piacere di conoscerti, ' + nome + '.  :)'
Ehilà, come ti chiami?
Chris
Ti chiami Chris?  Ma che bel nome!
Piacere di conoscerti, Chris.  :)

Molto meglio! Nota che siccome nome sta puntando a gets.chomp, non abbiamo nemmeno bisogno di dire nome.chomp;  nome era già "chompato".

Un Po' di Cose da Provare

• Scrivi un programma che chieda il nome dell'utente, quindi il secondo nome e quindi il cognome. Infine deve salutare l'utente usando il suo nome completo.

• Scrivi un programma che chieda all'utente quale sia il suo numero preferito. Poi fai sì che il programma sommi 1 al numero inserito e quindi suggerisca il risultato come un numero più grande e quindi migliore da preferire. (Abbi del tatto, però).

Le soluzioni sono disponibili nel Manuale delle Soluzioni :)

Una volta che hai finito questi due programmi (e qualsiasi altro che dovesse venirti in mente), sarà tempo d'imparare di più sui metodi.

Vorrai mica perderti altri articoli come questo?
Iscriviti per riceverne altri!

Scritto da

Duccio

Duccio Armenise

Corsidia Founder

Aiuto solo i migliori Maestri a trovare i loro prossimi Studenti. Come? Così! :)

Bio - uCV

Per

Corsidia logo

I tuoi prossimi Studenti ti stanno già cercando, tu ci sei?

Materie

Trova un altro corso