Rails: self.function 和 self.class.function 的区别
Rails: difference between self.function and self.class.function
我不确定我是否理解为什么我将 "var3 = self.class.function2" 替换为 "var3 = self.function2"
时会出现 NoMethodError 异常
什么时候应该使用 self 什么时候应该使用 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
因为 def self.function2
意味着 function2
是 "wired" 到 class (TestClass
) 而不是 class 的实例(TestClass.new
return class TestClass
的实例)。调用 self.class
returns class (TestClass
) 其中是 function2
based.
function2
也可以这样称呼:TestClass.function2
def self.function2
是您的 class 方法,不能用 class 的实例调用。它的调用方式类似于 TestClass.function2
。而 def function3
是实例方法。你说得对。
myvar = TestClass.new
myvar.function3
所以如果我们顺其自然。在 function3
下,self 将成为调用该函数的实例。
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.
现在,如果您尝试使用实例调用 class 方法,它肯定会出错。
我不确定我是否理解为什么我将 "var3 = self.class.function2" 替换为 "var3 = self.function2"
时会出现 NoMethodError 异常什么时候应该使用 self 什么时候应该使用 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
因为 def self.function2
意味着 function2
是 "wired" 到 class (TestClass
) 而不是 class 的实例(TestClass.new
return class TestClass
的实例)。调用 self.class
returns class (TestClass
) 其中是 function2
based.
function2
也可以这样称呼:TestClass.function2
def self.function2
是您的 class 方法,不能用 class 的实例调用。它的调用方式类似于 TestClass.function2
。而 def function3
是实例方法。你说得对。
myvar = TestClass.new
myvar.function3
所以如果我们顺其自然。在 function3
下,self 将成为调用该函数的实例。
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.
现在,如果您尝试使用实例调用 class 方法,它肯定会出错。