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