2013-04-28 64 views
0

下面的代码返回一个错误:问题与Ruby类方法的定义

class ABC 
    def self.method1() 
    method2 
    end 

    def method2 
    end 
end 

ABC.method1

NameError: undefined local variable or method `method2' for ABC:Class

但是,下面的代码工作正常:

class ABC 
    def initialize 
    method2 
    end 

    def method2 
    end 
end 

ABC.new

是否初始化需要使用为了正确定义班级内的所有方法?第一个代码块有什么问题?

回答

3

不具有类的对象不能调用实例方法。

method1是类ABC的类方法,因此您可以在类本身上调用它。但是如果你想调用你的实例方法method2,你需要一个类ABC的对象,而不是在类本身上调用它,即。

o = ABC.new 
o.method2 

的其他代码的作品,因为在initialize,你已经拥有你的ABC例如,你的方法调用可以理解为self.method2

2

method1是静态的,不是method2

ABC.method2是不确定的,ABC.new.method2是确定

class ABC 

    def self.method1() 
    method2 # ABC.method2 
    end 

    def initialize 
    method2 # self.method2, self is instance of ABC 
    end 

    def method2 
    end 
end 
+0

语言评论:'静态'是一个技术术语,它值得了解,但在Ruby本身中很少使用。在Ruby中,调用这种方法最明确的方法是'单例方法',或'对象的单例类的实例方法'。类的Singleton方法(它们本身就像任何其他对象一样)常常被昵称为“类方法”,以便将它们与类的实例方法区分开来。出于类似的原因,模块的单例方法被昵称为“模块方法”。 – 2013-04-28 13:46:54

0

在第一个代码块中,您尝试在类方法中调用实例方法,它就像调用ABC.method2一样,但ABC没有这种方法。