2

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

class Foo
  puts visibility
  # => "public"

  private
  puts visibility
  # => "private"
end

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

4

2 回答 2

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
于 2012-10-30T18:56:11.883 回答
0

在 Ruby 中,实例方法具有三个不同级别的可见性。

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

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

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

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

于 2012-10-30T14:45:10.873 回答