rubyacademy

 

MoreAboutMethods

Page history last edited by g 9 mos ago

Qualcos'altro sui metodi

 

Fin qui abbiamo visto alcuni metodi, puts, gets e gli altri (Quiz a sorpresa: Elencate tutti i metodi che abbiamo incontrato fin qui! Ce ne sono decine; la risposta è in fondo.), ma non abbiamo mai veramente parlato di cosa sono i metodi. Sappiamo cosa fanno ma non sappiamo cosa sono.

 

Ecco cosa sono effettivamente: cose che fanno cose. Se gli oggetti (come stringhe, interi, e decimali) sono i nomi nel linguaggio Ruby, allora i metodi sono come i verbi. E, proprio come nella lingua italiana, non si possono avere verbi senza un nome che li esegue. Ad esempio, il ticchettio non è qualcosa che semplicemente accade; un orologio (o una sveglia o qualcosa di simile) lo produce. In italiano diremmo, "L'orologio ticchetta." In Ruby potremmo scrivere orologio.ticchetta (ovviamente assumendo che orologio è un oggetto Ruby). I programmatori potrebbero dire che "abbiamo chiamato il metodo ticchetta di orologio," oppure che "chiamiamo ticchetta su orologio."

 

Avete fatto il quiz? Bene. Vediamo, sono sicuro che vi siete ricordati dei metodi puts, gets, e chomp, poiché ce ne siamo appena occupati. Probabilmente avete anche considerato i metodi di conversione, to_i, to_f, e to_s. Comunque, avete considerato anche gli altri quattro? Chi se non i nostri vecchi amici +, -, *, and /!

 

Come dicevo, così come ogni verbo ha bisogno di un sostantivo, allo stesso modo ogni metodo ha bisogno di un oggetto. Solitamente è semplice dire quale oggetto sta eseguendo il metodo: è quello che viene prima del punto, come nel nostro esempio orologio.ticchetta, oppure 101.to_s. A volte, comunque, non è così scontato; come succede per i metodi aritmetici. Risulta che 5 + 5 è solo un modo breve di scrivere 5.+ 5. Ad esempio:

 

puts 'hello '.+ 'world'

puts (10.* 9).+ 9

hello world

99

 

Non è molto gradevole, quindi non scriveremo mai in questo modo; comunque, l'importante è capire cosa è successo veramente. (Sulla mia macchina, che restituisce anche un warning:

warning: parenthesize argument(s) for future version.

Il codice viene eseguito correttamente, ma vengo avvertito che sta avendo problemi a capire cosa voglio dire, e mi invita ad usare più parentesi in futuro.) Questo ci permette di capire anche perché possiamo scrivere 'pig'*5 ma non possiamo scrivere 5*'pig': 'pig'*5 sta dicendo a 'pig' di moltiplicarsi, mentre 5*'pig' sta dicendo a 5 di moltiplicarsi. 'pig' sa come fare 5 copie di se stesso e sommarle tutte insieme; invece 5 potrebbe avere molta più difficoltà a fare 'pig' copie di se stesso e a sommarle insieme.

 

Utilizziamo puts e gets per spiegare tutto. Dove sono i loro oggetti? In italiano, si può qualche volta sottointendere il nome; ad esempio, se un furfante urla "Crepa!", il nome implicito è colui a cui sta urlando contro. In Ruby, se dico puts 'essere o non essere', in realtà sto dicendo self.puts 'essere o non essere'. Dunque cos'è self? è una variabile speciale che punta all'oggetto che la contiene. Non sappiamo ancora cosa vuol dire essere contenuto un oggetto, but until we find out, sappiamo di essere sempre in un grande oggetto che è... l'intero programma! E per nostra fortuna il programma ha alcuni suoi propri metodi, come puts e gets. Date uno sguardo a questo:

 

nonPossoCredereDiAverSceltoUnNomeCosiLungoSoloPerPuntareA3 = 3

puts nonPossoCredereDiAverSceltoUnNomeCosiLungoSoloPerPuntareA3

self.puts nonPossoCredereDiAverSceltoUnNomeCosiLungoSoloPerPuntareA3

3

3

 

Se non riuscite a capire tutto, va bene lo stesso. La cosa importante da capire da tutto questo è che ogni metodo viene eseguito da qualche oggetto, anche se non c'è il punto. Se capite questo, then you're all set.

 

Divertenti metodi per le stringhe

Impariamo adesso alcuni divertenti metodi per le stringhe. Non bisogna memorizzarli tutti; se ne dimenticate qualcuno potete sempre dare uno sguardo a questa pagina. Vi voglio mostrare solo una piccola parte delle cose che si possono fare con le stringhe. Infatti anche io riesco a ricordare non più della meta dei metodi delle stringhe — ma non è un problema, poiché ci sono delle ottime reference su internet con tutti i metodi elencati e spiegati. (Vi mostrerò dove trovarle alla fine di questa guida.) In realtà non voglio conoscere tutti i metodi delle stringhe; è un po' come voler conoscere ogni parola del dizionario. Posso parlare bene in italiano anche senza conoscere ogni parola del dizionario... and isn't that really the whole point of the dictionary? So you don't have to know what's in it?

 

Allora, il nostro primo metodo è reverse , che fornisce l'inverso di una stringa:

 

var1 = 'roma'

var2 = 'enoteca'

var3 = 'Puoi pronunciare questa frase al contrario?'

 

puts var1.reverse

puts var2.reverse

puts var3.reverse

puts var1

puts var2

puts var3

amor

acetone

?oirartnoc la esarf atseuq eraicnunorp iouP

roma

enoteca

Puoi pronunciare questa frase al contrario?

 

Come si può vedere, reverse non inverte la stringa originale; ma ne fa solo una copia inversa. Ecco perché var1 vale ancora 'roma' anche dopo aver chiamato reverse su var1.

 

Another string method is length, which tells us the number of characters (including spaces) in the string:

 

puts 'Quale è il tuo nome completo?'

nome = gets.chomp

puts 'Sai che ci sono ' + nome.length + ' caratteri nel tuo nome, ' + nome + '?'

Quale è il tuo nome completo?

Christopher David Pine

#<TypeError: can't convert Fixnum into String>

 

Uh-oh! Qualcosa è andata storta, e sembra che sia accaduto qualcosa dopo la riga name = gets.chomp... Avete riconosciuto il problema? Provate a trovarlo.

 

C'è un problema con length: fornisce un numero, ma noi vogliamo una stringa. La soluzione è semplice, dobbiamo solo inserire un to_s (e incrociare le dita):

 

puts 'Quale è il tuo nome completo?'

nome = gets.chomp

puts 'Sai che ci sono ' + nome.length.to_s + ' caratteri nel tuo nome, ' + nome + '?'

Quale è il tuo nome completo?

Christopher David Pine

Sai che ci sono 22 caratteri nel tuo nome, Christopher David Pine?

 

No, non lo so. Nota: quello è il numero di caratteri del mio nome, non il numero di lettere (contatele). Credo che possiamo scrivere un programma che ci chieda il nostro primo nome, il secondo nome e il cognome separatamente e che poi sommi le loro lunghezze insieme... hey, perché non lo fate voi! Iniziate, vi aspetto.

 

Fatto? Bene! è bello programmare, non trovate? Tra qualche capitolo sarete sorpresi da quello che potrete fare.

 

Ci sono anche alcuni metodi che cambiano il case (maiuscolo e minuscolo) delle stringhe. upcase cambia ogni lettera minuscola in maiuscola, e downcase cambia le maiuscole in minuscole. swapcase scambia il case di osni lettera della stringa, e infine, capitalize è come downcase, con la differenza che cambia solo il primo carattere in maiuscolo (se è una lettera).

 

lettere = 'aAbBcCdDeE'

puts lettere.upcase

puts lettere.downcase

puts lettere.swapcase

puts lettere.capitalize

puts ' a'.capitalize

puts lettere

AABBCCDDEE

aabbccddee

AaBbCcDdEe

Aabbccddee

a

aAbBcCdDeE

 

Tutta roba regolare. Come si può vedere, dalla riga puts ' a'.capitalize, il metodo capitalize rende maiuscolo il primo carattere, non la prima lettera. E anche, come abbiamo visto prima, nel chiamare questi metodi, la variabile lettere rimane immutata. Non intendo insistere su questo aspetto, ma è una cosa importante da capire. Ci sono alcuni metodi che cambiano l'oggetto associato, ma non ne abbiamo visti ancora, e non ne vedremo ancora per un po'.

 

Gli ultimi divertenti metodi che vedremo servono a formattare le stringhe. Il primo, center, aggiunge degli spazi all'inizio e alla fine della stringa al fine di centrarla. Ricapitolando, a puts va detto cosa si vuole stampare, a + cosa si vuole aggiungere, a center in che modo vogliamo che la nostra stringa sia centrata. Quindi se vogliamo centrare le righe di una poesia dobbiamo fare così:

 

lineWidth = 50

puts( 'Old Mother Hubbard'.center(lineWidth))

puts( 'Sat in her cupboard'.center(lineWidth))

puts( 'Eating her curds an whey,'.center(lineWidth))

puts( 'When along came a spider'.center(lineWidth))

puts( 'Which sat down beside her'.center(lineWidth))

puts('And scared her poor shoe dog away.'.center(lineWidth))

 

Old Mother Hubbard

Sat in her cupboard

Eating her curds an whey,

When along came a spider

Which sat down beside her

And scared her poor shoe dog away.

 

 

Hmmm... Non conosco il motivo di questa filastrocca, e sono troppo pigro per scoprirlo. (Inoltre, I wanted to line up the .center lineWidth part, so I put in those extra spaces before the strings. This is just because I think it is prettier that way. Programmers often have strong feelings about what is pretty in a program, and they often disagree about it. The more you program, the more you will come into your own style.) Speaking of being lazy, laziness isn't always a bad thing in programming. For example, see how I stored the width of the poem in the variable lineWidth? This was so that if I want to go back later and make the poem wider, I only have to change the very top line of the program, instead of every line which does centering. With a very long poem, this could save me a lot of time. That kind of laziness is really a virtue in programming.

 

 

(...continua)

Comments (0)

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