Vous pouvez utiliser la méthode #send pour appeler la méthode de l'objet par le nom de la méthode :
object.send(:foo) # same as object.foo
Vous pouvez passer des arguments à la méthode invoquée :
object.send(:foo, 1, "bar", 1.23) # same as object.foo(1, "bar", 1.23)
Ainsi, si vous avez un nom d'attribut dans la variable "attribut", vous pouvez lire l'attribut de l'objet avec
object.send(attribute.to_sym)
et écrire la valeur de l'attribut avec
object.send("#{attribute}=".to_sym, value)
Dans la version 1.8.6 de Ruby, la méthode #send peut exécuter la méthode de n'importe quel objet indépendamment de sa visibilité (vous pouvez par exemple appeler des méthodes privées). Ceci est susceptible de changer dans les futures versions de Ruby et vous ne devriez pas vous y fier. Pour exécuter des méthodes privées, utilisez #instance_eval :
object.instance_eval {
# code as block, can reference variables in current scope
}
# or
object.instance_eval <<-CODE
# code as string, can generate any code text
CODE
Mise à jour
Vous pouvez utiliser public_send
pour appeler des méthodes en tenant compte des règles de visibilité.
object.public_send :public_foo # ok
object.public_send :private_bar # exception