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.
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
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!)
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.
23. Il nome deve iniziare con un carattere maiuscolo (come le costanti)
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.
29.
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
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.
40.
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.
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