Ruby a proc
s et lambda
s (les deux instances de la classe Proc
) et Method
s, qui toutes les fonctions de premier ordre approximatives. Les Lambdas sont les plus proches d'une vraie fonction de première classe: ils vérifient le nombre d'arguments lorsqu'ils sont appelés et créent un nouveau contexte d'appel tel que return
revient juste de lambda. En revanche, les procs sont juste des blocs de code réifiés; ils ne vérifient pas leur nombre d'arguments, et un return
provoque le retour de la méthode englobante, pas seulement le proc.
Les objets de méthode vous permettent de stocker une méthode non appelée dans une variable, complétée par un invocant implicite. Il n'y a pas de syntaxe pour créer une méthode anonyme, mais vous avez dit des fonctions de première classe, pas anonymes. A part l'invocant, ce sont essentiellement des lambdas dont le corps est celui de la méthode référencée. Je ne suis pas sûr que ce que vous obtenez une classe anonyme est mieux que les solutions ci-dessus, mais il est certainement plus loin d'une véritable fonction de première classe. Cela ressemble plus à la façon dont nous devions les rapprocher en Java avant que les fermetures aient été ajoutées à la langue.
Que voulez-vous dire par "mieux"? Qu'essayez-vous d'accomplir? Plus de vitesse, ou une fonctionnalité supplémentaire? –
Lorsque vous appelez 'g (f.f)' dans le code ci-dessus, l'argument que vous passez à 'g' n'est pas une fonction. Vous appelez la méthode 'f.f' et passez le résultat, la chaîne' 'hi '' à 'g', qui retourne simplement son argument. –
@Jordan En fait 'puts' renvoie' nil', donc 'g (f.f)' prend 'nil' comme argument. – Aetherus