访问类体中的方法

时间:2016-02-11 07:33:09

标签: ruby

有人可以解释以下行为吗?

def a_method
  "a_method() was called by #{self}"
end

class MyClass
  puts a_method
  def another_method
    puts a_method
  end
end

MyClass.new.another_method

它产生以下输出:

a_method() was called by MyClass
a_method() was called by #<MyClass:0x000000034962b0>

puts a_method机构中的MyClass如何运作?如何在定义a_method时访问Myclass

3 个答案:

答案 0 :(得分:2)

(Outermost)Ruby语句按照它们的编写顺序调用和执行。

MyClass内,有一个方法调用puts a_method,其中self是类MyClass。这将打印输出的第一行。然后,稍后会有一个方法调用another_method,调用puts a_method,其中selfMyClass的实例。这将打印输出的第二行。

  

在定义Myclass时如何访问a_method

这似乎暗示您在关闭(第一次出现)类主体时要考虑完成类定义。然而情况并非如此。第一次打开类主体后立即创建一个类。因此,在类体中,您可以在类上调用方法。在类体中定义方法不是创建类的一部分;该类已经存在,它正在修改该类。

答案 1 :(得分:1)

第一个调用在Class范围内执行。因此,自我是阶级。第二个是在类的实例范围内执行的。您可以添加一个类方法,以获得与第一个方法调用相同的效果。

def a_method                                
  "a_method() was called by #{self}"        
end                                         

class MyClass                               
  puts a_method # how this works?           

  def another_method                        
    puts a_method                           
  end                                       

  def self.a_class_method                   
    puts a_method                           
  end                                       
end                                         

MyClass.a_class_method                      
MyClass.new.another_method  

# result
a_method() was called by MyClass
a_method() was called by MyClass
a_method() was called by #<MyClass:0x00000002dc49f0>

答案 2 :(得分:1)

一个类体在最初加载时执行(全局变量,类变量和常量在其中定义,最后定义方法)。

a_method在定义时MyClass调用。