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
我想了解为什么在这种情况下,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