Ruby on rails Rails:self.function和self.class.function之间的区别

Ruby on rails Rails:self.function和self.class.function之间的区别,ruby-on-rails,self,Ruby On Rails,Self,我不太明白,如果我将“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 = "wo

我不太明白,如果我将“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
是“连接”到类(
TestClass
)而不是类的实例(
TestClass.new
返回类的实例
TestClass
)。调用
self.class
返回类(
TestClass
),其中基于
function2


function2
也可以这样调用:
TestClass.function2
因为
def self.function2
意味着,
function2
是“连接”到类(
TestClass
)而不是类的实例(
TestClass.new
返回类的实例
TestClass
)。调用
self.class
返回类(
TestClass
),其中基于
function2


function2
也可以这样调用:
TestClass.function2

def self.function2
是不能用类实例调用的类方法。它的调用类似于
TestClass.function2
。而
def function3
是实例方法。你说得对

myvar = TestClass.new
myvar.function3
所以,如果我们遵循流程。在
function3
self下,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.

现在,如果您尝试用实例调用类方法,它肯定会出错。

def self。function2
是您的类方法,不能用类的实例调用。它的调用类似于
TestClass.function2
。而
def function3
是实例方法。你说得对

myvar = TestClass.new
myvar.function3
所以,如果我们遵循流程。在
function3
self下,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.

现在,如果您尝试用实例调用类方法,它肯定会出错。

def self.
是类方法<代码>定义函数3是一种实例方法。要调用类方法,您可以执行
self.class.function2
,但通常您只需执行
TestClass.function2
def self.是类方法<代码>定义函数3是一种实例方法。要调用类方法,可以执行
self.class.function2
,但通常只执行
TestClass.function2