Ruby 为什么在Object.private\u方法中提到在顶层创建的方法?

Ruby 为什么在Object.private\u方法中提到在顶层创建的方法?,ruby,self,Ruby,Self,据我所知,在Ruby的顶层创建的方法成为了对象的私有实例方法。但是为什么调用对象.private_方法时在数组中返回zzz方法名呢?为什么Object和self返回不同的私有实例方法名称 def zzz puts 'zzz' end p Object.private_instace_methods(false) #[:zzz] p self.private_methods(false) # [:public, :private, :include, :using, :define_met

据我所知,在Ruby的顶层创建的方法成为了
对象的私有实例方法。但是为什么调用
对象.private_方法时在数组中返回
zzz
方法名呢?为什么
Object
self
返回不同的私有实例方法名称

def zzz
   puts 'zzz'
end

p Object.private_instace_methods(false) #[:zzz]
p self.private_methods(false) # [:public, :private, :include, :using, :define_method, :zzz]

p Object.private_methods() #[:inherited, :initialize, :included,..., :zzz,..., :String, :Array, :singleton_method_undefined, :method_missing]
p Object.private_methods(false) #[:inherited, :initialize]

class Temp
  private
  def hello()
    'Hello'
  end
end

p Temp.private_instance_methods(false) # [:hello]
p Temp.new.private_methods(false) # [:hello]

p Temp.private_methods() # [:inherited, :initialize, :included, :extended,...., :zzz,..., :singleton_method_added, :singleton_method_removed, :singleton_method_undefined, :method_missing]  
#`zzz` is in list, but there is no `:hello`

p Temp.private_methods(false) # [:inherited, :initialize]

类是对象。对象是一个类,所以它获取对象的实例方法,就像其他对象一样

但为什么在调用Object.private_方法时在数组中返回zzz方法名

顶层的self是一个名为“main”的对象,“main”是类对象的实例:

p self
p self.class

--output:--
main
Object
类(例如Object)的
private\u instance\u methods()
是类(例如“main”)实例的
private\u methods()

为什么Object和self返回不同的实例方法名称

def zzz
   puts 'zzz'
end

p Object.private_instace_methods(false) #[:zzz]
p self.private_methods(false) # [:public, :private, :include, :using, :define_method, :zzz]

p Object.private_methods() #[:inherited, :initialize, :included,..., :zzz,..., :String, :Array, :singleton_method_undefined, :method_missing]
p Object.private_methods(false) #[:inherited, :initialize]

class Temp
  private
  def hello()
    'Hello'
  end
end

p Temp.private_instance_methods(false) # [:hello]
p Temp.new.private_methods(false) # [:hello]

p Temp.private_methods() # [:inherited, :initialize, :included, :extended,...., :zzz,..., :singleton_method_added, :singleton_method_removed, :singleton_method_undefined, :method_missing]  
#`zzz` is in list, but there is no `:hello`

p Temp.private_methods(false) # [:inherited, :initialize]
这不可能是因为self/main不是类,因此self/main不响应instance_方法()

对象与所有类一样,是类的实例,因此类的
private\u instance\u methods()

p Class.private_instance_methods(false)

--output:--
[:inherited, :initialize]
puts Temp.class

--output:--
Class
类实例的
私有方法()
,例如对象:

p Object.private_methods(false)

--output:--
[:inherited, :initialize]
这是:

Temp.private_methods() # [:inherited, :initialize, :included, :extended,...., :zzz,..., :singleton_method_added, :singleton_method_removed, :singleton_method_undefined, :method_missing]  
#`zzz` is in list, but there is no `:hello`
zzz()是在Object中定义的方法,这意味着
所有
对象都继承该方法。Temp是一个类,但Temp也是一个对象(它是类的实例):

因此,临时对象从对象继承了方法zzz()。事实上,所有对象都可以调用zzz(),因为所有对象都继承自对象,但由于zzz是对象中的私有实例方法,所以不能指定接收者:

def zzz
  puts 'zzz'
end

class Temp
  puts self  #=>Temp
  zzz        #When you don't specify a receiver for a method call
             #ruby uses self, so that line is equivalent to
             #self.zzz, which is equivalent to Temp.zzz

  def hello
    puts 'Hello!'

    puts self  #=>Temp_instance
    zzz        #Same as self.zz, which is equivalent to Temp_instance.zz 
  end
end

--output:--
Temp
zzz
Hello!
#<Temp:0x00000101136238>  
zzz
def zzz
放‘zzz’
结束
班级临时工
将self#=>Temp
zzz#当您没有为方法调用指定接收者时
#ruby使用self,因此该行相当于
#self.zzz,相当于Temp.zzz
你好
“你好!”
将self#=>Temp_放入实例
zzz#与self.zz相同,相当于Temp_instance.zz
结束
结束
--输出:--
临时雇员
zzz
你好
#  
zzz
方法hello()只能由类Temp的实例调用,因此Temp可以调用zzz(),但Temp不能调用hello():

class-Temp
你好
“你好!”
结束
结束
你好
你好
--输出:--
你好
1.rb:8:in`:Temp:Class(NoMethodError)的未定义方法“hello”

Hm。。。但是为什么它不适用于普通类呢?我将更新问题以使其更清晰。如果类对象(对象)函数
private\u methods
返回类实例(main)的私有方法名是真的,那么对于类Temp为什么不是真的呢。为什么它
p Temp.private_methods()
输出
zzz
,而不是
hello
。那么
呢?为什么Object和self返回不同的实例方法名称呢?
我的意思是
private
方法。首先,删除
private
。你的问题与私有方法和公共方法之间的区别无关。第二,我不知道你的评论是什么意思,但似乎你在理解像Temp这样的类既是类又是对象这一点上遇到了问题。作为一个对象,Temp可以调用其父类定义的任何方法,这些方法的顺序是:
类、模块、对象、基本对象
…另一方面,Temp不能调用Temp内部的defs(除非它们看起来像这样:
def self.meth\u name…
。Temp内部的defs只能由Temp的实例调用(或者Temp子类的实例)。或者你不明白private_instance_methods()和private_methods()之间的区别。第一个说,
好的,在我的左边,你是一个类(或模块),你的内部有def,我将列出这些def。
第二个说,
好的,在我的左边,你是一个对象,你可以调用创建你的类中定义的方法(以及它的超类),我将列出这些def。
这意味着只有类(或模块)可以调用private_instance_方法()因为它们是唯一具有def的对象……另一方面,所有对象都可以调用private_方法()。
def zzz
  puts 'zzz'
end

class Temp
  puts self  #=>Temp
  zzz        #When you don't specify a receiver for a method call
             #ruby uses self, so that line is equivalent to
             #self.zzz, which is equivalent to Temp.zzz

  def hello
    puts 'Hello!'

    puts self  #=>Temp_instance
    zzz        #Same as self.zz, which is equivalent to Temp_instance.zz 
  end
end

--output:--
Temp
zzz
Hello!
#<Temp:0x00000101136238>  
zzz
class Temp
  def hello
    puts 'Hello!'
  end
end

Temp.new.hello 
Temp.hello

--output:--
Hello!
1.rb:8:in `<main>': undefined method `hello' for Temp:Class (NoMethodError)