Dis comme ça, c'est difficile de savoir si tu as bien compris ou pas
Malheureusement il n'existe pas de concept équivalent en PHP.
Les blocs sont une syntaxe particulière pour les fonctions d'ordre supérieures, c'est à dire les fonctions qui prennent des fonctions en argument.
Tu peux te dire qu'on bloc est un "bout de code" que tu passes en argument à la fonction que tu appelles. Cette fonction fait alors ce qu'elle veut avec ton bout de code (typiquement elle l'appelle une ou plusieurs fois en lui passant des arguments qu'elle a crée).
Si tu as fait du PHP, il existe une fonction array_map qui peut ressembler au map/collect de Ruby :
1 2 3 4 5 6 7 8
| function carre($n) {
return $n*$n;
}
$nombres = array(2, 5, 10);
$carres = array_map('carre', $nombres); // execute la fonction "carre" pour tout les éléments du tableau
// $carres -> array(4, 25, 100) |
Maintenant, ce code PHP à quelques limitations : en particulier, la fonction "carre" doit être déclarée auparavant.
En Ruby, la fonction map/collect de la classe Array fait la même chose, en utilisant un bloc :
[2, 5, 10].map { |n| n*n } # => [4, 25, 100]
Ce qui prennait 5 lignes en PHP se fait en une seule ligne de Ruby
Concernant les variables du bloc, tu vois bien ici que "n" pourrait être remplacé par n'importe quoi : [2, 5, 10].map { |i| i*i } est évidemment strictement identique, tout comme en PHP on aurait pu écrire :
function carre($i) { return $i * $i; }
La notion de fonction d'ordre supérieur n'est pas forcément évidente lorsqu'on n'y est pas habitué. Comme toujours, c'est la pratique qui permet de mieux assimiler ces concepts.
Dans ton exemple original, create_table, tu utilises le DSL des migrations de Rails. Un DSL, c'est en quelque sorte un "mini-framework" dont l'objectif est de rendre une tâche (ici les migrations de base de données) le plus proche possible du langage naturel (anglais).
Le bloc est ici une manière de dire :
"create table utilisateurs with strings nom, prenom and integer age"
Ceci est un code Ruby qui fonctionne tout à fait, très proche de cette phrase :
create_table(:utilisateurs) { |t| t.string :nom, :prenom; t.integer :age }
La raison pour laquelle on l'écrit sur plusieurs lignes est évidement que c'est beaucoup plus lisible
Partager