Ruby打印当前可见性

时间:2012-10-30 13:27:42

标签: ruby scope metaprogramming visibility

所以,使用ruby中的所有元编程内容(使用1.9.3),我猜有一种方法可以返回当前的可见性。 让我们假设它被称为visibility

class Foo
  puts visibility
  # => "public"

  private
  puts visibility
  # => "private"
end

那么,什么是visibility - 如何找到ruby解释器在找到新方法定义时使用的当前可见性?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在Ruby中,对于实例方法,您有三种不同的可见性级别。

方法默认为public,这是您可能习惯的。如果您有权访问该对象,则始终可以访问此方法。

privateprotected相似。它们只能由类和子类访问。不同之处在于无法使用显式接收器调用public方法。这意味着你不能从同一个类的另一个实例调用另一个方法的private函数,而protected可以。{/ p>

因此,如果您需要在课堂外使用方法,请坚持public的默认可见性。如果您的方法需要由该类的任何实例访问,例如某些自定义比较逻辑,请使用protected。如果您的方法是在该类的实例之外不可见的任何内容,请使用private

要真实回答您的问题,visbility是一种返回当前可见状态的方法 - 无论是publicprivate还是protected