2009-07-24 5 views
1

Рассмотрим следующий код:Send позволяет получить доступ к частным переменным

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

После того как я сделать:

create_class('User', ActiveRecord::Base) 

следующее нормально:

Object.send(:remove_const, :User) 

но:

Object.remove_const :User 

результаты в этом:

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

? Не имеет смысла для меня ... может «отправить» переопределить проверки доступа Ruby? Пожалуйста помоги!

+0

В Ruby нет такой вещи, как частная переменная. Они все частные. Только методы имеют контроль доступа. –

ответ

4

Похоже, что он отменяет проверки доступа Ruby.

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

Я думаю, что вы хотели бы, чтобы хорошо играть с вещами других людей, которые сделали частные. Если вам нужно использовать методы отправки для вызова класса, который вы не создали, вероятно, вы должны сначала называть его obj.respond_to.

+0

выглядит так ... спасибо! Кстати, как вы можете «remove_const» быть вызванным _sanely_, т. е. каким другим вызовом? –

+1

Быстрый поиск в Google показывает это: http://www.java2s.com/Code/Ruby/Reflection/Callremoveconsttoremoveaclassdefinition.htm Я не пробовал, так что это может быть неправильно. Кроме того, вы можете изменить заголовок своего вопроса на что-то вроде «send позволяет доступ к закрытым переменным», чтобы его можно было легко найти. –

Смежные вопросы