2009-07-24 107 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