-2
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

由于某种原因 attr1, inChild1#some_method1 与它的价值nil不同。Module1::Base1.method1我想知道为什么以及我应该怎么做才能摆脱它?

4

2 回答 2

1

attr_accessor创建实例变量,因此您的代码正在创建类实例变量:因为类是对象,它们也可以具有实例变量。这些变量不是继承的。

还有类变量@@foo

Ruby 没有一种变量类型,它的继承方式与方法继承的工作方式相同。诸如 active support 之类的库添加了一个版本attr_accessor(active support 调用它class_attribute),它设置了正确的钩子来创建行为像这样的访问器——你可以看看源代码

于 2013-02-04T08:02:13.210 回答
1

首先,我想应该有s/method/attr/g

Module1::Base1.configure do |item|
  item.method1 = "43243243"
  item.method2 = "fdsfdsfd"
end

次要的,在some_method1我们称之为 eigenclass 的 attr 中:

#... some stuff
"#{Base1.attr1}_123"  #for some reason attr1 is nil

产生:

#!/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
于 2013-02-04T09:28:16.300 回答