Ruby 中方法和 public_methods 之间的区别

Eng*_*mon 5 ruby

我只是想知道Rubymethods和之间到底有什么区别public_methods?来自RubyMonk 分析部分

对象上的methods方法允许我们访问对象及其祖先上可用的公共方法列表。这相当于使用 public_methods。它们返回属于该对象的所有实例方法和类方法以及该对象的祖先上可访问的方法。如果您想忽略祖先并将列表限制为仅接收者,您可以将 false 传递给 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)
Run Code Online (Sandbox Code Playgroud)

标准输出:

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] 
Run Code Online (Sandbox Code Playgroud)

从上面的输出我只是看到methodspublic_methods不一样,但无法找出它们之间的确切区别。

Mys*_*yst 6

在对象类文档中Object#public_methods

\n\n
\n

返回 obj 可访问的公共方法的列表。如果 all 参数设置为false,则仅接收器中的那些方法列出

\n
\n\n

相反,文档Object#methods state 的文档:

\n\n
\n

返回obj 的公共方法和受保护方法的名称列表。这将包括 obj\xe2\x80\x99s 祖先中可访问的所有方法。如果可选参数为false ,则返回 obj\xe2\x80\x98s 公共和受保护单例的数组,该数组将不包含 obj 中包含的模块中的方法。

\n
\n\n

所以:

\n\n
    \n
  1. #public_methods仅返回公共方法,而#methods还返回受保护方法(的名称)。

  2. \n
  3. 参数false有不同的作用。我不太确定差异的范围,但在我看来,主要差异是单例方法与实例方法*。

  4. \n
\n\n
\n\n

*如果类是接收者,“实例方法”也可以引用类方法 - 因为一切都是对象,并且如类文档中所述:

\n\n
\n

Ruby 中的类是第一类对象——每个类都是 Class 类的一个实例。

\n
\n