2009-07-24 112 views
1

考虑下面的代码:发送允许访问私有变量

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中没有真正的私有变量。他们都是私人的。只有方法有访问控制。 – 2012-03-27 23:28:24

回答

4

它看起来好像覆盖了Ruby的访问检查。

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

我的猜测是,你想的事情其他人也犯私人发挥很好。如果你需要使用send来调用你没有创建的类的方法,你应该首先调用obj.respond_to

+0

看起来像...谢谢!顺便说一句,你怎么能'remove_const'被调用,即,其他方法调用它? – 2009-07-24 13:12:51