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

reducm · 发布于 2012年07月11日 · 最后由 ruuuby 回复于 2013年02月01日 · 2237 次阅读
465
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

共收到 12 条回复
465

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

729

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

729

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

967

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

465

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

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

96

是这个意思吗?

# 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
96

 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
2456

是不是这样?

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 这句就不能用了。

2456

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

96

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

465

#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)里面的常量吗

96

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

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