Ruby 请教如何在这种情况下获取上层 Module 的常量

reducm · July 11, 2012 · Last by ruuuby replied at February 01, 2013 · 3574 hits
module Douban
  FILE ="#{Rails.root}/config/douban.yml"
  include Jconfig
end

module Jconfig
  def self.included(receiver)
    receiver.send :include, Config
  end

  module Config
    #这里怎样才能获取到Douban::FILE这个常量?其中一个办法是上面self.included的时候把receiver里面的东西传进来,但是如果是要在Douban::Config这个域里面怎样才能获取上层module的常量呢?
  end
end

Douban::Config.ancestors #=> ['Jconfig::Config']

#1 楼 @reducm 你是要在 module Config 里面直接引用呢? 还是在 module Config 下面的方面中引用呢?

#1 楼 @reducm 看不太明白需求

确实有这类问题,会涉及到嵌套引用了,这个上次好像在哪看到个 gem 可以解决这个问题, 简单点解决的话就是把 FILE 放到 Jconfig::Config

#2 楼 @ShiningRay 在动态生成的 Douban::Config 里面获取 Douban::FILE 常量

#4 楼 @tumayun 因为每个要 include Jconfig 的 module 里面的 FILE 都是不同的,所以不能直接设在 Config 里头

是这个意思吗?

# encoding: UTF-8

module Douban
  FILE ="/config/douban.yml"
end

module Jconfig
  def self.included(receiver)
    receiver.send :include, Config
  end

  module Config
    def self.included(receiver)
      puts receiver::FILE
    end
  end
end


module Douban
  include Jconfig
end

 1 module Douban                                                               
 2   FILE ="/home/lcq"
 3   Jconfig = Module.new do
 4   def self.included(receiver)
 5     receiver.send :include, Config
 6   end
 7 
 8   Config = Module.new do
 9     puts FILE
10     def self.say
11       puts self
12     end
13   end
14   end
15 
16   include Jconfig
17 end
18 
19 Douban::Jconfig::included Douban
20 Douban::Config::say

是不是这样?

module Douban
  FILE="test constant"
  #  include ::Jconfig
end

module Jconfig
  def self.included(receiver)
    receiver.send :include, Config
  end

  module Config
    puts ::Douban::FILE
  end
end

这种情况需要定义在同一个文件中,但是 include ::Jconfig 这句就不能用了。

另外一种思路是利用扁平化作用域,将 Jconfig 和 Config 模块的定义方法改为 Module.new 如 #7 楼 @jiffies 所述。

不知道是作者表述不清还是怎么的,感觉你们连边都没摸着。

#6 楼 @hhuai #9 楼 @zlx_star #7 楼 @jiffies 不好意思,比较忙迟了回复 @hhuai 想获取上层常量 FILE 的方式并不是 include 的时候指定进去,而是想动态运行时获取,例如通过 Config 里面指定的一个方法,Douban::Config.example_method

@zlx_star @jiffies 的确可以通过同一域 new 的方式解决,但这种方式写的时候其实默认已经知道了 FILE 的存在,并不是运行时去获取。本人的问题是许多 Module 已经写定了,本来是想通过一 include Jconfig 后,每个模组下都有个 Config 的命名空间,去处理原来 module 定义后的 FILE,解决这个问题也有很多方法

现在问题是,ruby 能在运行时获取上层命名空间(or module)里面的常量吗

可以吧,递归向上查找变量或方法

You need to Sign in before reply, if you don't have an account, please Sign up first.