Ruby 使用方法初始化类属性

Ruby 使用方法初始化类属性,ruby,Ruby,目标是使用在子类中重写的类方法初始化类属性。以下是我的ruby类的定义: class A class_attribute :query self.query = self.generate_query def self.generate_query return "abcd" end end class B < A def self.generate_query query_part_1 = "ab" return query_par

目标是使用在子类中重写的类方法初始化类属性。以下是我的ruby类的定义:

class A
  class_attribute :query
  self.query = self.generate_query

  def self.generate_query
     return "abcd"
  end
end

class B  < A
  def self.generate_query
     query_part_1 = "ab"
     return query_part_1 + generate_query_part_2
  end

  def self.generate_query_part_2
    return part_2
  end
end

但是,如果首先实例化A,则会将类A和B的查询初始化为相同的值,因为
self.query.nil?
也会为B返回false。

问题的解决方案很简单:

在定义
generate\u query
方法之前,您正在调用
self.query=self.generate\u query
!记住——Ruby是自上而下解释的,你的类主体也一样。在定义方法之前,不能调用该方法。 只需将代码更改为

class A
  class_attribute :query

  def self.generate_query
    return "abcd"
  end

  self.query = self.generate_query
end
将使其正常工作,但您将遇到另一个问题,因为行
self.query=self.generate\u query
将在您的类中仅计算一次-
B
将引用
“abo”
查询,而不是
“ab2”

为了实现您想要的行为-您需要自己定义一个getter方法,它作为一个属性(
class\u attribute
在后台做同样的事情)

解决方案
A类
def self.query
@查询| |=self.generate|u查询
结束
def self.generate_查询
返回“abcd”
结束
结束
B类
“但是,通过这段代码,我得到了未定义的方法generate\u query for class A.”–提示:您在哪一行调用它?你在哪一行定义它?这两个谁先来?@JörgWMittag谢谢!我确实意识到错误是由于订购造成的。但是,在子类的情况下,仅仅更改顺序并不能给出所需的行为。这违背了将
query
作为类属性的目的。这意味着每次创建类的新实例时都会调用
generate\u query
,并构造一个新字符串。不,只有
@query
为nil时才会调用
generate\u query
@query
是一个类属性,将永远保留在
a
/
B
对象上的定义-在
generate\u query
中添加一个
put
语句,自己尝试一下。我的错误。谢谢你的回答,这个很好用。
class A
  class_attribute :query

  def self.generate_query
    return "abcd"
  end

  self.query = self.generate_query
end
class A
  def self.query
    @query ||= self.generate_query
  end

  def self.generate_query
    return "abcd"
  end
end

class B  < A
  def self.generate_query
    query_part_1 = "ab"
    return query_part_1 + generate_query_part_2
  end

  def self.generate_query_part_2
    return '2'
  end
end