2017-03-17 5 views
0

"var3 = self.class.function2"를 "var3 = self.function2"로 바꿀 경우 왜 NoMethodError 예외가 발생하는지 잘 모르겠다레일 : self.function과 self.class.function의 차이점

언제 내가 자기를 사용해야하며 언제 self.class를 사용해야합니까?

class TestClass 
    var1 = nil 

    def self.function1 
    var1 = "hello" 
    end 

    def self.function2 
    p self.function1 
    var2 = "world" 
    end 

    def function3 
    var3 = self.class.function2 
    p var3 
    end 
end 


myvar = TestClass.new 
myvar.function3 
+0

'def self.'는 클래스 메소드입니다. 'def function3'은 인스턴스 메소드입니다. 클래스 메소드를 호출하기 위해서는'self.class.function2'을 할 수 있지만 일반적으로'TestClass.function2' 만하면됩니다. – Fallenhero

답변

1

def self.function2이 클래스의 인스턴스 호출 할 수 없습니다 수업 방법이다. TestClass.function2과 같습니다. def function3은 인스턴스 메소드입니다. 당신은 그것을 올바르게 부르고 있습니다.

myvar = TestClass.new 
myvar.function3 

그래서 우리가 흐름을 따르십시오. function3 아래에서이 함수를 호출하는 인스턴스가됩니다.

var3 = self.class.function2 # Here self is myvar 
# self.class == TestClass 
# self.class.function2 == TestClass.function2 # No error 
# self.function2 == myvar.function2 # error, Calling class method with instance of class. 

이제 인스턴스를 사용하여 클래스 메서드를 호출하려고하면 오류가 발생합니다.

0

def self.function2 수단 때문에 function2하지 클래스의 인스턴스 (클래스 TestClassTestClass.new 복귀 인스턴스)에 클래스 (TestClass)으로 "유선"이다. self.class 호출은 function2을 기반으로하는 클래스 (TestClass)를 반환합니다.

function2도이 방법으로 호출 할 수 있습니다 TestClass.function2