【问题标题】:Sharing class variables between the instance and the class itself when extended within a module在模块内扩展时,在实例和类本身之间共享类变量
【发布时间】:2011-04-14 03:22:01
【问题描述】:

我试图弄清楚为什么这个代码:

class BaseClass
end

module Extensions
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def message(message)
      @@message = message
    end
  end
end

BaseClass.send(:include, Extensions)

class ExtendedClass < BaseClass
  message "hello world!"

  def say_message
    puts @@message
  end
end

ExtendedClass.new.say_message

输出:

test.rb:22:in `say_message': uninitialized class variable @@message in ExtendedClass (NameError)
    from test.rb:26:in `<main>'

而不是

hello world!

你能解释一下为什么吗?

【问题讨论】:

    标签: ruby class variables module metaprogramming


    【解决方案1】:

    因为当这个方法被执行时:

    def message(message)
      @@message = message
    end
    

    @@message 引用模块 ClassMethods 中的一个类变量(不是 ExtendedClass 类)

    这里有一个改变,让它按照你期望的方式工作:

    def message(message)
      self.send(:class_variable_set, "@@message", message)
    end
    

    这有点反模式(使用“发送”来绕过“class_variable_set”是私有的事实),但我相信它回答了这个问题。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多