2012-10-30 62 views
2

所以,所有的元編程的東西在紅寶石(使用1.9.3),我想有一種方法返回當前的可見性。 讓我們假設它被稱爲visibilityRuby打印當前的可見性

class Foo 
    puts visibility 
    # => "public" 

    private 
    puts visibility 
    # => "private" 
end 

那麼,什麼visibility - 我怎樣才能得到當前的知名度Ruby解釋器,當他發現新的方法定義使用?

+0

看起來像Rubinius的傢伙線的東西必須實現這樣的事情:https://github.com/rubinius/rubinius/blob/35dbaf5efa8c3b0babf2b2ee656769cf8438b54f/ kernel/common/variable_scope.rb#L141 – pje

回答

0

在Ruby中,實例方法有三個不同級別的可見性。

方法默認爲public,這是你可能習慣的。如果您有權訪問該對象,則始終可以訪問此方法。

privateprotected是相似的。它們只能由類和子類訪問。區別在於public方法不能用明確的接收方來調用。這意味着你不能從同一類的另一個實例調用另一個方法的private函數,而protected可以。

因此,如果您需要在班級之外提供方法,請堅持默認的可見性public。如果您的方法需要由該類的任何實例訪問,例如某些自定義比較邏輯,請使用protected。如果你的方法是任何在該類的實例之外不可見的東西,請使用private

要真正回答您的問題,visbility是一種返回當前可見狀態的方法 - 無論是public,private還是protected

+1

我知道這一切。對不起,你誤解了我的問題,我已經更新了一下。我想知道,Ruby解釋器認爲目前的知名度如何。所以,當口譯員遇到新的方法時:它會具有哪種可見性? – knub

1

AFAIK,沒有現成的使用方法。你可以實現一個,然而,隨着(未經測試)

class Class 
    def visibility 
    define_method(:__visibility_discovery__) { } 
    visibility = 
     if protected_method_defined? :__visibility_discovery__ 
     "protected" 
     elsif private_method_defined? :__visibility_discovery__ 
     "private" 
     else 
     "public" 
     end 
    remove_method :__visibility_discovery__ 
    end 
end 
+0

這使「公開」兩次。我猜define_method總是公開的。 – knub