• [^] # Re: Code le toi même

    Posté par . En réponse à la dépêche Sortie de Moonlight 1.0. Évalué à 3.

    Bon les gars, là, vous n’avez pas compris les principes de Ruby.

    D’abord, cette fonction get! n’a pas à être dans le langage par défaut, ne serait-ce que parce que l’on peut très bien vouloir avoir des nil dans son Array. Ce n’est pas la valeur de l’élément qu’il faut tester mais si l’indice est ou non hors champ.

    Mais ce n’est pas le point principal. Ce qu’il faut comprendre, c’est qu’un Array n’est pas un tableau comme en C ou en Java.
    Un Array, c’est une structure de données de type collection, séquentielle et indexée, donc comme un tableau ou une liste. C’est comme un Hash mais les clefs sont des entiers et les éléments sont ordonnés dans une séquence, donc on peut récupérer des sous-séquences.

    Si l’on a un Hash qui ne possède pas de valeur pour une clef (disons :toto), que h[:toto] renvoie nil vous choque ? Bien sûr que non. C’est pareil en Java (on récupère null d’une Hashmap quand la clef n’y a pas de correspondant). C’est pareil en C++ avec les std::map (on récupère une référence sur une nouvelle place).
    Or on pourrait très bien vouloir que ça lance une exception IllegalKey ou autre.
    C’est un choix.

    En Ruby, il a été décidé que c’était pareil pour les Array : un indice hors taille renvoie nil.
    Vous pouvez aussi utiliser des indices négatifs : a[-1] renvoie le dernier élément, a[-2] l’avant-dernier, etc.
    Et des Range : a[1..5] donne la sous-séquence des éléments 2 à 6, ou a[1,4] qui donne la sous-séquence de 4 éléments à partir du 2e.

    On pourra aussi remarquer que, souvent, là où l’on utilise un Hash, on peut utiliser un Array ou une lambda : tous les trois répondent à l’opérateur [].

    Oui, c’est du Duck-Typing. Si vous voulez du typage fort, vous prenez C++ ou Java ou autre (Java, surtout si vous voulez des exceptions partout).