【问题标题】:Ruby - uninitialized class variable in instance methodsRuby - 实例方法中未初始化的类变量
【发布时间】:2017-10-23 23:36:11
【问题描述】:

我正在学习 RoR 课程,但在 irb 控制台中收到错误消息: "NameError: InstanceCounter::InstanceMethods 中未初始化的类变量@@instances"

我需要在 modules.rb 中更改什么?

控制台:

Evgenys-MacBook-Pro-2:lesson_05 admin$ irb
2.3.1 :001 > load 'modules.rb'
 => true 
2.3.1 :002 > load 'car.rb'
 => true 
2.3.1 :003 > car=Car.new
initialize
NameError: uninitialized class variable @@instances in InstanceCounter::InstanceMethods
Did you mean?  instance_methods
from modules.rb:35:in `initialize'
from (irb):3:in `new'
from (irb):3
from /Users/aku/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>'

modules.rb:

module InstanceCounter
  module ClassMethods

    @@instances = 0

    def instances
      puts "@@instances"
      @@instances
    end

  end

  module InstanceMethods

    def initialize
      puts "initialize"
      register_instance
      super
    end

    protected

    def register_instance
      @@instances += 1
      puts "@@instances += 1"
    end

  end

  def self.included(base)
    base.extend ClassMethods
    base.send :prepend, InstanceMethods
  end
end

汽车.rb:

class Car
  include InstanceCounter

  def initialize
    puts "initialize2"
  end  
end

class PassengerCar < Car
end

class CargoCar < Car
end

【问题讨论】:

    标签: ruby mixins instance-variables class-variables


    【解决方案1】:

    将类变量放在InstanceMethods 模块中。默认情况下,extend 似乎只向调用对象添加方法。

    关于默认 ruby​​ 实现的文档供参考:extendinclude

    【讨论】:

    • extend 没有“添加”任何东西。 o.extend(M) 只是使 M 成为 o 的单例类的超类。 IOW,它(或多或少)相当于class &lt;&lt; o; include M endinclude 使模块成为类的超类)。
    • "将类变量放在 InstanceMethods 模块中" - 不起作用(((我已将 @@instances = 0 添加到 ClassMethods 和 InstanceMethods - 它无法正常工作。如果我添加 @@实例 = 0 仅到 InstanceMethods - 我在 irb 中收到一个错误:Car.instances ->>>“NameError: uninitialized class variable @@instances in InstanceCounter::ClassMethods”
    • 感谢 Jörg 的澄清。 @EvggenyS 我没有很好地回答您的问题,并且 ruby​​ 继承可能有点令人困惑。我认为这个问题可能会对您有所帮助:stackoverflow.com/questions/30022273/…
    猜你喜欢
    • 2011-06-21
    • 2017-04-05
    • 2010-10-06
    • 2017-02-23
    • 2011-09-24
    • 2010-12-01
    • 2016-02-13
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多