Vous pouvez alternativement appeler sendavec son synonyme __send__:
r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')
Au fait * vous pouvez passer des hachages en tant que paramètres séparés par des virgules comme ceci:
imaginary_object.__send__(:find, :city => "city100")
ou nouvelle syntaxe de hachage:
imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])
Selon Black, __send__est plus sûr pour l'espace de noms.
«L'envoi est un concept large: un e-mail est envoyé, les données sont envoyées aux sockets d'E / S, etc. Il n'est pas rare que les programmes définissent une méthode appelée send qui entre en conflit avec la méthode d'envoi intégrée de Ruby. Par conséquent, Ruby vous offre une autre façon d'appeler envoyer:__send__ . Par convention, personne n'écrit jamais une méthode avec ce nom, donc la version intégrée de Ruby est toujours disponible et n'entre jamais en conflit avec les méthodes nouvellement écrites. Cela semble étrange, mais c'est plus sûr que la version d'envoi simple du point de vue des conflits de nom de méthode "
Noir suggère également des appels d'emballage à __send__en if respond_to?(method_name).
if r.respond_to?(method_name)
puts r.__send__(method_name)
else
puts "#{r.to_s} doesn't respond to #{method_name}"
end
Réf: Black, David A. Le Rubyiste bien fondé. Manning, 2009. P.171.
* Je suis venu ici à la recherche d'une syntaxe de hachage pour __send__, donc cela peut être utile pour d'autres googleurs. ;)
*dans ce contexte, il s'agit de l'opérateur "splat".