所以,所有的元編程的東西在紅寶石(使用1.9.3),我想有一種方法返回當前的可見性。 讓我們假設它被稱爲visibility
。Ruby打印當前的可見性
class Foo
puts visibility
# => "public"
private
puts visibility
# => "private"
end
那麼,什麼visibility
- 我怎樣才能得到當前的知名度Ruby解釋器,當他發現新的方法定義使用?
所以,所有的元編程的東西在紅寶石(使用1.9.3),我想有一種方法返回當前的可見性。 讓我們假設它被稱爲visibility
。Ruby打印當前的可見性
class Foo
puts visibility
# => "public"
private
puts visibility
# => "private"
end
那麼,什麼visibility
- 我怎樣才能得到當前的知名度Ruby解釋器,當他發現新的方法定義使用?
在Ruby中,實例方法有三個不同級別的可見性。
方法默認爲public
,這是你可能習慣的。如果您有權訪問該對象,則始終可以訪問此方法。
private
和protected
是相似的。它們只能由類和子類訪問。區別在於public
方法不能用明確的接收方來調用。這意味着你不能從同一類的另一個實例調用另一個方法的private
函數,而protected
可以。
因此,如果您需要在班級之外提供方法,請堅持默認的可見性public
。如果您的方法需要由該類的任何實例訪問,例如某些自定義比較邏輯,請使用protected
。如果你的方法是任何在該類的實例之外不可見的東西,請使用private
。
要真正回答您的問題,visbility
是一種返回當前可見狀態的方法 - 無論是public
,private
還是protected
。
我知道這一切。對不起,你誤解了我的問題,我已經更新了一下。我想知道,Ruby解釋器認爲目前的知名度如何。所以,當口譯員遇到新的方法時:它會具有哪種可見性? – knub
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
這使「公開」兩次。我猜define_method總是公開的。 – knub
看起來像Rubinius的傢伙線的東西必須實現這樣的事情:https://github.com/rubinius/rubinius/blob/35dbaf5efa8c3b0babf2b2ee656769cf8438b54f/ kernel/common/variable_scope.rb#L141 – pje