Self shorthand 的行为方式与 class << self rails 不同

Self shorthand doesn't behave the same way than class << self rails

我想了解为什么在这种情况下,A 的子类不会继承自 sequence_name

class A < ApplicationRecord
  self.abstract_class = true
  self.sequence_name = "my_seq"
end

以及为什么当定义如下时他们会。

class A < ApplicationRecord
  self.abstract_class = true
 
  class << self
    def sequence_name
      "my_seq"
    end
  end
end

我认为 self.method 等同于:

class << self
  def method; end
end

I thought that self.method was equivalent to:

class << self
  def method; end
end

不完全是。

您可以通过在 class' 单例 class 中定义实例方法来创建 class 方法:(这就是 class 方法的真正含义)

class A
  class << self
    def method; end
  end
end

或者使用 def self. 语法:(等同于上面的)

class A
  def self.method; end
end

要从 class 中 调用 方法,您将使用:

class A
  method
end

如果你的方法是setter,你必须添加一个明确的接收者,例如:

class A
  self.method = 123
end

这看起来有点像用于定义 class 方法的 def self. 语法,但请注意这里没有 def


您可以将您的工作代码重写为:

class A < ApplicationRecord
  self.abstract_class = true
 
  def self.sequence_name
    "my_seq"
  end
end