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

reducm · 2012年07月11日 · 最后由 ruuuby 回复于 2013年02月01日 · 3580 次阅读
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)里面的常量吗

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

需要 登录 后方可回复, 如果你还没有账号请 注册新账号