Ruby 使用方法初始化类属性
目标是使用在子类中重写的类方法初始化类属性。以下是我的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
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