• [^] # Re: Différence avec Python ?

    Posté par . En réponse à la dépêche Sortie de Ruby 1.8.2. Évalué à 2.

    Pour ce qui est de la différence entre Python et Ruby, c'est surtout une affaire de goût. Personnelement j'adore le pouvoir d'expression de Ruby. Ça me fait penser (à raison puisque que c'était le but) à la syntaxe de SmallTalk en ajoutant tout un tas de bonnes idées d'autres langages plus convientionnel (Perl pour l'intégration des expressions régulières^Wrationnelles par exemple). Je trouve la page Wikipédia sur Ruby pas trop mal faite car elle montre assez simplement les petits plus du langage http://fr.wikipedia.org/wiki/Ruby(...) . Par exemple, je trouve l'utilisation des blocs et itérateurs super simple et beaucoup plus lisible que les structures du style 'for ...'. Sans compter le pouvoir de surcharge des classes de base comme en SmallTalk. Je cherchais le moyen de pouvoir ajouter la méthode 'sum' sur un tableau d'entier (pour sommer tous les éléments du tableau), une petite recherche sur Internet m'a donné le code inspiré de SmallTalk suivant :
    class Array 
     def inject(n)
     each { |value| n = yield(n, value) }
     return n
     end
     def sum
     inject(0) { |n, value| n + value }
     end
     def mult
     inject(1) { |n, value| n * value }
     end
    end
    puts [1, 20, 5, 7].sum # 33
    puts [1, 20, 5, 7].mult # 700
    puts (1..10).to_a.sum # 55
    puts (1..10).to_a.mult # 3 628 800 = 10!
    
    Ce n'est pas grand chose mais c'est toujours agréable d'avoir une si grande liberté d'expression dans un langage interprété. Un autre exemple sympa, c'est la possibilité de récupéré les messages non compris par une classe (method_missing) :
    require 'singleton'
    class Roman
     include Singleton
     @@values= {" "=>0, "I"=>1, "V"=>5, "X"=>10, "L"=>50, "C"=>100, "D"=>500, "M"=>1000}
     def romanToInt(str)
     result=0; str+=" "; flag=0
     (0..str.size-2).each do
     |i|
     if flag==1 then
     flag=0
     next
     end
     if @@values[str[i+1,1]]>@@values[str[i,1]] then
     result+=@@values[str[i+1,1]]-@@values[str[i,1]]
     flag=1
     else
     result+=@@values[str[i,1]]
     end
     end
     return result
     end
     def method_missing(methId)
     str = methId.id2name
     romanToInt(str.upcase)
     end
    end
    puts Roman.instance.DCCCLXXXVIII # 888
    puts Roman.instance.MMII # 2002
    puts Roman.instance.MDXV # 1515
    puts Roman.instance.MCMLXXV # 1975
    puts Roman.instance.LXXXVIII # 88
    puts Roman.instance.MMMCMXCIX # 3999
    puts Roman.instance.MMMDDDCCCLLLVVVIII # 4968
    
    J'ai écris le code 'romanToInt' vite fait, y'a surement moyen de faire beaucoup mieux niveau lisibilité. Après, je ne connais pas assez Python pour faire une comparaison objective, mais personnelement j'ai tout de suite accroché à Ruby alors que je rechigne toujours à modifier du code Python :/.