因此,对于 ruby 中的所有元编程内容(使用 1.9.3),我想有一种方法可以返回当前的可见性。让我们假设它被称为visibility
.
class Foo
puts visibility
# => "public"
private
puts visibility
# => "private"
end
那么,什么visibility
- 我如何获得 ruby 解释器在找到新方法定义时使用的当前可见性?
因此,对于 ruby 中的所有元编程内容(使用 1.9.3),我想有一种方法可以返回当前的可见性。让我们假设它被称为visibility
.
class Foo
puts visibility
# => "public"
private
puts visibility
# => "private"
end
那么,什么visibility
- 我如何获得 ruby 解释器在找到新方法定义时使用的当前可见性?
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
在 Ruby 中,实例方法具有三个不同级别的可见性。
方法默认为public
,您可能已经习惯了。如果您有权访问该对象,则您始终可以访问此方法。
private
并且protected
是相似的。它们只能由类和子类访问。不同之处在于public
不能使用显式接收器调用方法。这意味着您不能private
从同一类的另一个实例调用另一个方法的函数,而protected
可以。
因此,如果您需要方法在您的类之外可用,请坚持使用public
. 如果您的方法需要由该类的任何实例访问,例如一些自定义比较逻辑,请使用protected
. 如果您的方法是在该类的实例之外不可见的任何内容,请使用private
.
要真正回答您的问题,visbility
是一种返回当前可见性状态的方法 - 无论是public
、private
还是protected
.