Ruby中方法和public_methods之间的区别

时间:2015-05-12 08:47:08

标签: ruby

我很想知道Ruby中methodspublic_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] 

从上面的输出我看到methodspublic_methods不相同但无法找出它们之间的确切区别。

1 个答案:

答案 0 :(得分:4)

Object#public_methods的Object类文档中:

  

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

相比之下,Object#methods州的文档:

  

返回obj的 public和protected 方法的名称列表。这将包括obj的祖先可访问的所有方法。如果可选参数为 false ,则返回obj的public和protected singleton 方法的数组,该数组将不包含obj中包含的模块中的方法。

所以:

  1. #public_methods仅返回公开的方法,而#methods也返回受保护方法的名称。

  2. false参数具有不同的效果。我不太确定差异的范围,但在我看来,主要区别在于单身方法与实例方法 *。

  3. *'instance methods'也可以引用类方法,如果class是接收者 - 因为一切都是对象,并且如Class documentation中所述:

      

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