Je suis très content. J’ai installé Ubuntu (qui m’a fait quelques frayeurs en ne répondant plus pendant le formatage du disque dur…) et j’ai installé Ruby, Scite (l’éditeur de texte) et même Ruby on Rails (après avoir installé Ruby Gems). Ensuite, j’ai installé Ruby DBI, la fameuse lib qui me posait problème. Mais (parce qu’il y a un “mais” vous l’aurez compris), j’ai toujours un problème. Dès que je fais require 'dbi', j’ai une belle erreur :

in `gem_original_require': no such file to load -- deprecated (LoadError)

Alors je veux bien comprendre que Windows est pas un environnement optimal pour le Ruby, je veux bien avoir du mal à installer les bonnes librairies, mais bon sang, si je change d’OS et qu’en même temps j’arrive à installer la bonne lib, j’aimerais bien pouvoir l’utiliser! Bref, si quelqu’un peut m’expliquer où est le problème, si ça vient de moi (sûrement) ou de la version de Ruby DBI, je suis preneur.

En attendant, je me suis baladé sur le site officiel de Ruby et j’ai lu la partie “Ruby in Twenty Minutes”, et c’est vraiment bien. Je pense que si j’avais lu ça au départ, j’aurais mal saisi des trucs. Mais a posteriori, lorsque je lis ça, je comprends tout à fait ET j’apprends encore des choses.

Le Quickstart en Ruby

Le site officiel a donc une introduction au Ruby assez intéressante, parcourant les String, les Numbers, le module Math, la création d’une méthode et la création d’une Classe (avec ses méthodes, ses attributs). Bref, une piqûre de rappel qui m’a quand même appris quelques nouvelles astuces.

instance_methods

La méthode .instance_methods liste toutes les méthodes disponibles pour une classe donnée. Et c’est super pratique.

class Bonjour
def initialize(nom)
@nom = nom
end
def salut
puts "Salut #{@nom}!"
end
def au_revoir
puts "A plus #{@nom}."
end
end
b = Bonjour.new("Wayne")
b.salut # Salut Wayne!

J’ai créé une classe, rien de plus banal. On va maintenant lister les méthodes auxquelles elle peut accéder.

puts Bonjour.instance_methods
=begin
inspect
au_revoir
tap
clone
public_methods
__send__
object_id
instance_variable_defined?
equal?
freeze
extend
send
methods
hash
dup
to_enum
instance_variables
eql?
instance_eval
id
singleton_methods
taint
enum_for
frozen?
instance_variable_get
instance_of?
display
to_a
method
type
instance_exec
protected_methods
==
===
instance_variable_set
kind_of?
respond_to?
to_s
salut
class
__id__
tainted?
=~
private_methods
untaint
nil?
is_a?
=end

Whaou, ça en fait beaucoup. Et pourtant on en a définie que 2. En fait, on affiche ici aussi les méthodes des classes ancêtres, et notamment des classes Object et Class. Pour n’avoir que celles spécifique à la classe Bonjour, on fait :

puts Bonjour.instance_methods(false)
# salut
# au_revoir

Nettement mieux non ?

respond_to?

Super pratique : la méthode .respond_to permet de vérifier si on peut utiliser la méthode passée en argument. Exemple :

mon_nombre = 2
puts mon_nombre.respond_to?("each") # false
mon_tableau = ["un","deux"]
puts mon_tableau.respond_to?("each") # true

On peut pas appliquer la méthode .each à mon nombre pour faire une itération. Par contre, on peut le faire pour mon tableau (logique). Même résultat pour respond_to?("join").