La dernière fois, on a vu comment calculer la liste des diviseurs d’un nombre avec (1..8).select {|int| 8 % int == 0 }. On va aujourd’hui faire en sorte que ça fonctionne avec n’importe quel nombre, en écrivant notre propre méthode.

Résumons : pour trouver les diviseurs de 8, j’écris:

(1..8).select {|int| 8 % int == 0 }

et pour trouver les diviseurs de 4, j’écris:

(1..4).select {|int| 4 % int == 0 }

Ce que je veux, c’est une façon de faire plus générale: je veux trouver les diviseurs pour tout entier n. Essayons donc de remplacer le nombre recherché par n:

>> (1..n).select {|int| n % int == 0 }
NoMethodError: undefined method `n' on an instance of Object.

Ruby n’est pas content et nous signale qu’il ne connait pas n. Ok, essayons alors de définir n d’abord:

>> n = 8
=> 8
>> (1..n).select {|int| n % int == 0 }
=> [1, 2, 4, 8]

Cette fois c’est bon. Maintenant vous êtes prêt à définir une méthode:

def divisors(n)
  (1..n).select {|int| n % int == 0 }
end

Pour information, divisors est le mot anglais pour diviseurs.

Une définition de méthode commence par le mot-clé def et se termine par le mot-clé end. La méthode ci-dessus s’appelle divisors et elle prend un argument qui est nommé n.

On lance/appelle/exécute une méthode simplement par son nom, sans oublier son (ses) argument(s). Par exemple divisors 8 va calculer et renvoyer la liste des diviseurs de 8. Voici un exemple d’utilisation lors d’une session irb:

>> def divisors(n)
>>   (1..n).select {|int| n % int == 0 }
>> end
>> divisors 8
=> [1, 2, 4, 8]
>> divisors 4
=> [1, 2, 4]
>> divisors 417
=> [1, 3, 139, 417]

La prochaine fois nous verrons comment se servir de la méthode divisors comme d’une base pour construire une autre méthode.

À demain.