2009-07-24 11 views
1

Considérez le code suivant:Envoyer permet d'accéder à des variables privées

def create_class(class_name, superclass, &block) 
    klass = Class.new superclass, &block 
    Object.const_set class_name, klass 
end 

Après que je fais:

create_class('User', ActiveRecord::Base) 

ce qui suit est ok:

Object.send(:remove_const, :User) 

mais ceci:

Object.remove_const :User 

de ce:

NoMethodError: private method `remove_const' called for Object:Class 

? Cela n'a pas de sens pour moi ... peut 'envoyer' remplacer les contrôles d'accès de Ruby? S'il vous plaît aider!

+0

Il n'y a pas vraiment de variable privée dans Ruby. Ils sont tous privés. Seules les méthodes ont un contrôle d'accès. –

Répondre

4

Il semble que cela remplace les contrôles d'accès de Ruby.

http://joshstaiger.org/archives/2006/12/the_ruby_send_h.html

Je suppose que vous voulez jouer bien avec les choses d'autres personnes ont privé. Si vous devez utiliser des méthodes send to call d'une classe que vous n'avez pas créée, vous devez d'abord appeler le obj.respond_to.

+0

ressemble à ça ... merci! En passant, comment pouvez-vous appeler 'remove_const', c'est-à-dire, quelle autre méthode l'appelle? –

+1

Une recherche google rapide révèle ceci: http://www.java2s.com/Code/Ruby/Reflection/Callremoveconsttoremoveaclassdefinition.htm Je ne l'ai pas essayé, donc il pourrait être faux. Aussi, vous voudrez peut-être changer le titre de votre question à quelque chose comme "envoyer permet l'accès aux variables privées" afin qu'il puisse être plus facilement recherché. –

Questions connexes