Débuter en programmation avec Ruby

Je viens de finir ce livre en 2 jours, je ne suis pas débutant en programmation, mais j'ai eu envie de repartir de zéro afin solidifier mes bases en Ruby puis de passer aux livres de niveau "expert".
Première chose sur ce livre il s'adresse bien à un futur programmeur qui débute en programmation ou en Ruby. C'est plutôt une bonne chose !!! Mais en plus d'être clair et agréable à lire, ce livre reprend les concepts fondamentaux de la programmation (procédurale et objet). Je le conseil donc à tous ceux qui débute en programmation mais aussi à ceux qui s'initient au langage Ruby. Car Chris Pine (l'auteur) est très pédagogue et explique aussi certains aspects caractéristiques de ruby tel que l'exécution des blocs de code et des procs :

def ma_fonction un_proc
    puts 'Je suis occuped !!!'
    un_proc.call
    puts 'OK je suis dispo.'
end

proc_dire_bonjour = Proc.new do
    puts 'Bonjour'
end

proc_dire_aurevoir = Proc.new do
   puts 'Au revoir'
end

ma_fonction proc_dire_bonjour
ma_fonction proc_dire_aurevoir

Résultat dans IRB :

irb(main):031:0* ma_fonction proc_dire_bonjour
Je suis occuped !!!
Bonjour
OK je suis dispo.
=> nil
irb(main):032:0> ma_fonction proc_dire_aurevoir
Je suis occuped !!!
Au revoir
OK je suis dispo.
=> nil

Alors vous me direz, oui mais c'est quoi cet exemple à la c*n ???
Imaginez que pour une raison ou pour une autre vous rêviez d'executer 3 fois le code d'un proc passé en paramêtre de notre fonction "ma_fonction" (chose qui peut être crucial dans les routines de tests automatiques d'applications, de jeux vidéos ou autres):

def ma_fonction un_proc
    puts 'Je suis occuped !!!'
    un_proc.call
    un_proc.call
    un_proc.call
    puts 'OK je suis dispo.'
end

ou encore

def ma_fonction un_proc
    puts 'Je suis occuped !!!'
    3.times do
      un_proc.call
    end
    puts 'OK je suis dispo.'
end

Et voilà le tour est joué. Pour les connaisseurs ce traitement est très puissants... Je vous laisse le maîtriser à travers le livre.
Ruby a aussi un système similaire aux procs qui sont les blocs, en gros on peux créer une fonction capable d'exécuter un bloc de code comme ceci :

def ma_fonction &un_bloc
    start_time = Time.now
    un_bloc.call
    duration = Time.now - start_time
    puts 'Temps d\'execution : ' + duration.to_s + 'secondes'
end

ma_fonction do
    #Je calcule quelque chose de très grand
    number = 1
    25000.times do
        number = number + number
    end
    puts 'Le result est un nombre à ' + number.to_s.length.to_s + ' chiffres'
end

C'est vraiment trop beau ; je crée une fonction qui accepte un bloc en paramètre (noter le '&' devant 'un_bloc'), et tout ce qui est exécuté dans mon bloc, est profilé (le temps d'exécution). Je vous laisse imaginez les possibilités offertes par ces deux exemples (raccourcis) de Chris Pine mais qui sont propre au langage Ruby...

Personnellement je recherche, maintenant, un livre de niveau expert en Ruby (fera l'objet d'un autre post) et je commence la seconde édition du livre "RubyOnRails" de Dave Thomas et David Heinemeier.
RUBY quand tu nous tient !!!