Apprendre Ruby

Avant de faire du Ruby on Rails il faut bien que je sois capable de faire du Ruby tout court. En ce qui me concerne le processus d’apprentissage commence pratiquement toujours par la recherche d’un point de référence. C’est encore plus vrai pour les langages (de programmation ou autre). Par exemple, au début, pour parler anglais je devais traduire en temps réel jusqu’au point ou j’ai eu une maîtrise du nouveau langage suffisante pour commencer a penser en anglais.

Donc dans mon processus d’apprentissage de Ruby je fais la même chose et mon langue de référence bein c’est Java. En fait, quand j’ai appris le javascript j’étais un peu rouiller et ma référence était le basic. Pas le visual basic, le vrai basic avec les numéro de ligne… C’était comme essayer d’apprendre le chinois en partant du français. Mais bon de Javascript a Java c’est plus simple et de Java a Ruby; bein on vas voir. Comme mon point de référence c’est java je cherche aussi le pattern de la structure du langage qui est sans doute le bout le plus confus. Disons que le langage est pas exactement dans la même famille mais ce n’est pas non plus trop loin. Enfin bref comme je cherche les similitudes je me suis un peu casser le nez sur les codes blocks.

Au début je les voyais comme des « anonymous inner class » mais j’ai finalement compris que bon c’est unique a Ruby et que il y en a pas en Java. Mais ils sont cool quand même c’est truc alors je n’ai pas pu m’empêcher de jouer avec le concept dans ma tête en allant a l’épicerie et voici ce que ça donne.

Je vois 2 façon de faire quelque chose de semblable en java. Les 2 utilise le varargs de java 1.5. Le première est de tout simplement faire une méthode une autre méthode en paramêtre.

public void sort(Object[] src, Method method){
method.invoke();
}

Il faut seulement que la méthode reçu ait comme signature Object… objects

La deuxième façon et sans doute la plus élégante est de remplace l’objet de type Method dans l’exemple précédant par un Object implémentant l’ interface suivante via une « anonymous inner class ». Bon c’est pas une réplique exacte du truc mais je vois une couple de cas ou ça pourrait être utile.

public interface CodeBlock {

public Object yield(Object… object);

}

Leave a Reply

You must be logged in to post a comment.