Your SlideShare is downloading. ×
Rubynetto
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Rubynetto

440
views

Published on

Concetti base su Ruby, in particolare Classi, Oggetti e Metodi che vi permetteranno di iniziare ad usare facilmente Ruby. …

Concetti base su Ruby, in particolare Classi, Oggetti e Metodi che vi permetteranno di iniziare ad usare facilmente Ruby.

Slide usate per uno degli incontri del seminario su Ruby On Rails chiamato Rubynetto, organizzato dal Catania Ruby User Group.

Published in: Technology

2 Comments
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
440
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
12
Comments
2
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Ho creato e usato queste slide per uno degli incontri del seminario su Ruby On Rails chiamato Rubynetto :D Rubynetto e' stato organizzato dal Catania Ruby User Group al centro di aggregazione popolare GAPA (Catania) a Dicembre 2009. In queste slide troverete concetti base su Ruby, in particolare Classi, Oggetti e Metodi che vi permetteranno di iniziare ad usare facilmente Ruby. Spero che siano utili a coloro che hanno partecipato all'incontro ed a chi sta imparando Ruby. Alessandro De Simone
  • 2. Ruby e' Pure Object Oriented
      Se vuoi programmare (bene) in Ruby, devi conoscere questi concetti: Ruby e' detto linguaggio ad oggetti puro, questo vuo dire :
      • tutti i valori sono Object, non c'e' quindi differenza tra tipi primitivi (String, Integer, …) e tipi oggetto
      • 5. non esistono funzioni e procedure, tipiche di altri linguaggi, ma solo metodi
  • 6. Iniziamo dai Methods
      Ma non dovremmo iniziare dalle classi ? Si puo' programmare in ruby anche senza creare nuove Class, ma senza creare nuovi methods puoi fare davvero poco. Creiamo il primo Method Cosa puoi capire da questo Method ?
      def palindroma?(parola) parola == parola.reverse endc
  • 7. I fantastici 4
      Possiamo dedurre che il metodo ' palindroma?'
    • e' definito dalla keyword def
    • 8. ha un nome
    • 9. ha un argomento/i
    • 10. ha un valore di ritorno
      def palindroma?(parola) parola == parola.reverse end
  • 11. Come ti chiami ?
    • Per convenzione il nome dei methods inizia con un carattere minuscolo (altrimenti verrebbe confuso con una costante) e se composto da piu' parole queste vengono separate da underscore '_'
    • 12. I punto interrogativo ed esclamativo non ha un significato speciale per l'interprete, ma puoi usarli per creare nomi piu' espressivi:
      • nil?, empty?, instance_of? , … sono chiamati Predicates , e di solito tornano true o false
      • 13. sort!, uniq!, slice!, … sono chiamati Bang methods e di solito modificano l'object. Nota: esistono bang method che non modificano l'oggetto e method 'non bang' che lo modificano (ed: exit!)
  • 14.
      Predicates e Bang (qualche esempio)
    irb(main):051:0> [].nil? => false irb(main):053:0> [].empty? => true irb(main):054:0> nil.nil? => true irb(main):057:0> 3.instance_of? String => false irb(main):047:0> a = [4,7,2,1] => [4, 7, 2, 1] irb(main):048:0> a.sort => [1, 2, 4, 7] irb(main):049:0> a => [4, 7, 2, 1] irb(main):050:0> a.sort! #sort e sort! sono 2 differenti methods => [1, 2, 4, 7]
  • 15. Piu' precisamente ...
      … un method e' un blocco di codice parametrizzato ed associato ad uno o piu' Objects I methods sono sempre invocati su un oggetto.
    • Nella terminologia Object Oriented quando si chiama (o invoca) un method di un object, si dice che un messaggio e' inviato all'object (che e' quindi il ricevente del messaggio).
    irb(main):047:0> a = [4,7,2,1] => [4, 7, 2, 1] irb(main):048:0> a.sort # esiste la Bang variant di sort => [1, 2, 4, 7] irb(main):049:0> a => [4, 7, 2, 1] irb(main):050:0> a.sort! #sort e sort! sono 2 differenti methods => [1, 2, 4, 7]
  • 16. Valore di ritorno Quale e' il valore (o i valori) ritornati dal metodo ? E' il valore dell'ultima espressione nel method. In e' come se fosse:
      def palindroma?(parola) parola == parola.reverse end
      return (parola == parola.reverse)
  • 17. Gli argomenti
    • I method accettano 0 o piu' argomenti separati da virgola
    • 18. Le parentesi sono opzionali, nella definizione e nell'invocazione
    • 19. Gli argomenti possono avere valori di default
    • 20. Il tipo di ogni argomento e' quello del valore passato nell'invocazione
    Es: def conta(frase, carattere = 'o') # valore di default 'o' n = 0 for c in frase.split('') n = n + 1 if c == carattere end n end puts conta('la mucca fa muuuuuuuuuuuuuuuu', 'u') puts conta('in gatto fa miaooooomiaooooomiaooooomiaooooo') puts conta('la zanzara fa szszszszszzzzszszszszsssssssssszzzz', 'z')
  • 21. Named arguments Quando un method ha troppi argomenti diventa difficile ricordarne l'ordine per poter invocare il method Soluzione: mediante gli Hash “nominiamo” gli argomenti ! L'uso dei named arguments mediante Hash e' di uso comune. Moltissimi medodi di Rails li usano. def conta(args) frase = args[:frase] carattere = args[:carattere] || 'o' # valore di default 'o' n = 0 for c in frase.split('') n = n + 1 if c == carattere end n end puts conta({:frase => 'la mucca fa muuuuuuuuuuuu', :carattere => 'u'}) puts conta({:frase => 'in gatto fa miaooooomiaoomiaooooomiaooooo'}) puts conta(:frase => 'la zanzara fa szszszszszzszs',:carattere => 'z')
  • 22. Class
    • Per creare una classe si sua la keyword class
    • 23. Il nome deve iniziare con un carattere maiuscolo (come le costanti)
    • 24. Una istanza della classe si crea con Nome_classe.new
    • 25. Viene inizializzata nel method initialize
    • 26. Es:
    class Bike def initialize ... end def pedala ... end end graziella = Bike.new
  • 27. Class (esempio) class Bike def initialize(marca, diametro) @marca = marca @distanza = 0 #cm @circ_ruota = diametro * 2.54 * 3.14 #cm @dim_ruota = diametro #pollici end def pedala @distanza += @dim_ruota end ... end mountain_bike = Bike.new('Bianchi', 26) 10.times{ mountain_bike.pedala } puts mountain_bike.distanza
  • 28. Variabili di istanza
    • Iniziano sempre con @: @marca, @distanza, …
    • 29. Ogni oggetto ha le proprie variabili di istanza:
    • Non devono essere dichiarate, basta inizializzarle nel method initialize
    • 30. Si puo' accedere ad una variabile di istanza solo dai metodi di istanza dell'oggetto
    • 31. Se si vuole accedere alle variabili di istanza da fuori l'oggetto bisogna definire dei metodi (spesso chiamati setter e i getter)
    mountain_bike = Bike.new('Bianchi', 26) # in mountain_bike @marca vale 'Bianchi' e @circ_ruota vale 26 graziella = Bike.new('Atala',20) #in graziella @marca vale 'atala' e @circ_ruota vale 20
  • 32. Getter e Setter Nel seguente esempio @distanza viene letta mediante il method distanza e viene scritta mediante il method @distanza= : Per facilita' variabile e metodo hanno lo stesso nome (non e' necessario). class Bike ... def distanza # getter method @distanza end def distanza=(distanza) #setter method @distanza = distanza End ... end mountain_bike = Bike.new('Bianchi', 26) 10.times{ mountain_bike.pedala } puts mountain_bike.distanza
  • 33. Variabili di Classe
    • Il loro none inizia con @@, ad es: @@numero_bike = 0
    • 34. Sono accessibili e condivise da tutti i metodi di istanza e di classe
    • 35. Vengono inizializzate nella classe, non nel metodo initialize
  • 36. Variabili di classe (esempio) class Bike @@count_bike = 0 # variabile di classe ... def initialize(marca, diametro) ... @@count_bike += 1 # aggiorno il numero di bike ... End ... def self.numero_bike # metodo di classe @@count_bike end ... end mountain_bike = Bike.new('Bianchi', 26) graziella= Bike.new('Atala', 20) puts "Numero biciclette: #{Bike.numero_bike}"
  • 37. Occhio alle 'Variabili di istanza di classe' ! class Bike @no_ist = 0 # Non e' una variabile di istanza, ma una # ' variabile di istanza di classe ' (poco usate) @@var_class = 0 # e' una variabile di classe def initialize @var_ist = 0 # e' una variabile di istanza end … end
  • 38. Metodi di Classe Sono quei metodi che hanno a che fare con la classe e non con le singole istanze della classe (gli oggetti). Esistono vari modi per crearle, ecco i due piu' famosi: 1) self .nome_metodo 2) Nome_classe .nome_metodo class Bike @@count_bike = 0 # variabile di classe def self.numero_bike # 1) metodo di classe @@count_bike end # def Bike.numero_bike # 2)e' equivalente ad 1) # @@count_bike # end end
  • 39. Dov'e' il trucco ? Consideriamo palindroma.rb: Palindroma? e' un metodo.
      Su quale object e' invocato Palindroma? ?
      def palindroma?(parola) parola == parola.reverse end palindroma? 'ailatiditalia'
  • 40. Self e Object
      Risposta: Palindroma? e' invocato sull'object self
    • self e' una keyword che identifica l'object sul quale il method e' stato chiamato
    • 41. Se l'object non e' specificato nel method allora verra' implicitamente usato self
    • 42. Nel caso di Palindroma? self e' di tipo Object
    • 43. Object e' la classe dalla quale tutti gli altri object ereditano
    irb(main):148:0> self => main irb(main):149:0> self.class => Object irb(main):150:0>
  • 44. main L'oggetto al top level e' chiamato ”main” ed e' un istanza di Object . Ogni metodo definito in main e' aggiunto in Object (per la precisione come instance method) ed e' quindi visibile in tutte le classi. Modifichiamo il method palindroma?
      def palindroma?(parola) parola == parola.reverse end
      def palindroma?
        self == self.reverse
      end
  • 45. Method in main Se definiamo il method palindroma? nell'object main, sara' visibile a tutti gli oggetti, di qualunque class, anche Fixnum: Attenzione: Fixnum non ha il method reverse, quindi, per evitare l'errore, dentro il metodo palindroma? bisogna prima convertire parola in String: parola = parola.to_s irb(main):157:0> 'lalalal'.palindroma? => true irb(main):159:0> 1234.palindroma? NoMethodError: undefined method `reverse' for 1234:Fixnum from (irb):154:in `palindroma?' from (irb):159 from :0 irb(main):160:0>
  • 46. Bibliografia The ruby Programming Language (O'REALLY) by David Flanagan e Yukihiro Matsumoto Ringraziamenti Michelangelo Altamore ed Enzo Rivello insieme ai quali e' stato organizzato Rubynetto. Il centro GAPA, Domenico e tutti i ragazzi del Catania Linux User Group per l'aiuto organizzativo