2009-07-24 5 views
1

Betrachten Sie den folgenden Code ein:Senden ermöglicht den Zugriff auf private Variablen

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

Nachdem ich tun:

create_class('User', ActiveRecord::Base) 

Folgendes ist ok:

Object.send(:remove_const, :User) 

aber dies:

Object.remove_const :User 

Ergebnisse in dieser:

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

? Für mich ergibt das keinen Sinn ... kann 'senden' Ruby's Zugriffskontrollen überschreiben? Bitte helfen Sie!

+0

Es gibt nicht wirklich so etwas wie eine private Variable in Ruby. Sie sind alle privat. Nur Methoden haben Zugriffssteuerung. –

Antwort

4

Es sieht so aus, als würde es Rubys Zugriffschecks außer Kraft setzen.

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

Meine Vermutung ist, dass Sie schön andere Leute haben privat gemacht mit Dingen spielen möchten. Wenn Sie Methoden zum Senden einer Methode verwenden müssen, die Sie nicht erstellt haben, sollten Sie zuerst obj.respond_to aufrufen.

+0

sieht so aus ... danke! By the way, wie kann 'remove_const' _sanely_ aufgerufen werden, d. h. welche andere Methode nennt es? –

+1

Eine schnelle Google-Suche zeigt dies: http://www.java2s.com/Code/Ruby/Reflection/Callremoveconsttoremoveaclassdefinition.htm Ich habe es nicht versucht, also könnte es falsch sein. Möglicherweise möchten Sie auch den Titel Ihrer Frage in "Senden ermöglicht Zugriff auf private Variablen" ändern, damit leichter gesucht werden kann. –