我很想知道Ruby中methods
和public_methods
之间究竟有什么区别?
来自RubyMonk 分析部分
Object上的方法方法允许我们进入列表 Object及其祖先上可用的公共方法。这是 相当于使用public_methods。他们返回所有实例 方法和属于该对象的类方法和那些 可以访问该对象的祖先。如果你想忽略了 祖先和限制列表只是接收器,你可以通过 对于public_methods(false),这是假的。
为了好奇,我还会调用methods(false)
来返回不同的输出
public_methods(false)
我的示例代码和输出:
p String.methods.size
p String.public_methods.size
p String.methods(false).size
p String.public_methods(false).size
p String.public_methods(false) - String.methods(false)
STDOUT:
235
235
3
19
[:json_create, :yaml_tag, :const_missing, :allocate, :new, :superclass, :cattr_reader, :cattr_writer, :cattr_accessor, :class_attribute, :superclass_delegating_accessor, :descendants, :subclasses, :duplicable?, :json_creatable?, :to_yaml]
从上面的输出我看到methods
和public_methods
不相同但无法找出它们之间的确切区别。
答案 0 :(得分:4)
在Object#public_methods
的Object类文档中:
返回obj可访问的公共方法列表。如果all参数设置为 false ,则只会列出接收器中的方法。
相比之下,Object#methods
州的文档:
返回obj的 public和protected 方法的名称列表。这将包括obj的祖先可访问的所有方法。如果可选参数为 false ,则返回obj的public和protected singleton 方法的数组,该数组将不包含obj中包含的模块中的方法。
所以:
#public_methods
仅返回公开的方法,而#methods
也返回受保护方法的名称。
false
参数具有不同的效果。我不太确定差异的范围,但在我看来,主要区别在于单身方法与实例方法 *。
*'instance methods'也可以引用类方法,如果class是接收者 - 因为一切都是对象,并且如Class documentation中所述:
Ruby中的类是第一类对象---每个都是类Class的实例。