Ruby 派生类没有';没有基类属性';s值 模块1 基类1 class
Ruby 派生类没有';没有基类属性';s值 模块1 基类1 class,ruby,Ruby,attr\u accessor创建实例变量,因此您的代码正在创建类实例变量:由于类是对象,它们也可以有实例变量。这些变量不是继承的 还有类变量(@@foo),这可能会让人吃惊-如果更改派生类中的值,它会更改整个层次结构中的值 Ruby没有一种类型的变量是以方法继承的方式继承的。诸如active support之类的库添加了一个版本的attr\u accessor(active support称之为class\u attribute),它设置了正确的钩子来创建这样的访问器-您可以查看其源代码首先,
attr\u accessor
创建实例变量,因此您的代码正在创建类实例变量:由于类是对象,它们也可以有实例变量。这些变量不是继承的
还有类变量(@@foo
),这可能会让人吃惊-如果更改派生类中的值,它会更改整个层次结构中的值
Ruby没有一种类型的变量是以方法继承的方式继承的。诸如active support之类的库添加了一个版本的
attr\u accessor
(active support称之为class\u attribute
),它设置了正确的钩子来创建这样的访问器-您可以查看其源代码首先,我想应该有s/method/attr/g
:
module Module1
class Base1
class << self
attr_accessor :attr1, :attr2
def configure
yield(self) if block_given?
end
end
end
end
module Module1
class Child1 < Base1
def self.some_method1
#... some stuff
"#{attr1}_123" #for some reason attr1 is nil
end
end
end
Module1::Base1.configure do |item|
item.method1 = "43243243"
item.method2 = "fdsfdsfd"
end
data1 = Module1::Child1.some_method1 #it doesn't return what I expect
其次,在某些方法1中,我们称特征类为'attr:
Module1::Base1.configure do |item|
item.method1 = "43243243"
item.method2 = "fdsfdsfd"
end
屈服:
#... some stuff
"#{Base1.attr1}_123" #for some reason attr1 is nil
问题是如何避免这种情况,而不是为什么会发生。替代方法是使用@var或借用活动支持的class\u属性thingI不使用两个活动支持no@@var。@@var是邪恶的。@@var确实令人困惑。活动支持代码应易于模仿/复制
#!/usr/bin/ruby
module Module1
class Base1
class << self
attr_accessor :attr1, :attr2
def configure
yield(self) if block_given?
end
end
end
end
module Module1
class Child1 < Base1
def self.some_method1
#... some stuff
"#{Base1.attr1}_123" #for some reason attr1 is nil
end
end
end
Module1::Base1.configure do |item|
item.attr1 = "43243243"
item.attr2 = "fdsfdsfd"
end
puts Module1::Child1.some_method1 #it does return what I expect
$ /tmp/a.rb
43243243_123