新手问题 一个关于 module 的问题

ibachue · 2013年03月05日 · 最后由 zgm 回复于 2013年03月05日 · 2366 次阅读

Hi all, 这个问题真心水,但是我搞了半天竟然都没有玩出来,就是如何将一个 module extend 进所有 Module 中?尝试了 instance_exec class_exec module_exec,都不对。。 谢谢大家啦。。

class Module
  include YourModule
end
2 楼 已删除

#1 楼 @zgm 貌似没成功诶。。 测试代码如下:

require 'active_support/all'

class Module
  include ActiveSupport::Autoload
end  

module A
  autoload :B
end  
# => ArgumentError: wrong number of arguments(1 for 2)

4 楼 已删除

#4 楼 @lshgood 论家不是 Rails 项目啦。。

#3 楼 @iBachue

module M
  def foo
    p 'foo'
  end  
end

=> nil

class Module
  include M
end

=> Module

module N
end

=> nil

N.foo
"foo"
=> "foo"
7 楼 已删除

#7 楼 @lshgood 如果require 'active_support/all'没有成功的话应该是出 LoadError 才对吧。。

#6 楼 @zgm 你那个结果我也能 reproduce,但是换成 ActiveSupport::Autoload 似乎就是不行,难道因为 autoload 是 C 定义的方法优先权比 Ruby 的高??

#3 楼 @iBachue 貌似是的,优先级不如内如定义的。

#9 楼 @iBachue 那个人怎么老把自己的留言删了,我还没看到呢。

#11 楼 @zgm 额。。神马情况。。他的方法就是

class Module 
  include ActiveSupport::Autoload
  extend ActiveSupport::Autoload
end

同时兼顾了类方法和实例方法

#10 楼 @zgm 那我觉得这是一个 Bug。。

#13 楼 @iBachue 这不是 bug,这就是方法的优先级啊。 include 的方法,优先级永远小于自己的方法。所有 Module 自身已经有一个 autoload 方法了。所以。。。

Kernel 里增加吧

#14 楼 @zgm 额 感觉怪怪的

#17 楼 @iBachue 你知道 open class 么?

#17 楼 @iBachue ruby 2.0 prepend 也能解决这个问题吧。

#18 楼 @i5ting 你是说往 Kernel 这里 module 里 extend 模块?

#19 楼 @zgm 好吧。。。

#20 楼 @iBachue 我猜的,没试过,你的问题貌似是这样的

#22 楼 @i5ting 刚才试了下 别说内定的 autoload,连自定的 ruby 方法都不行。。。

require 'active_support/all'

class Module
  remove_method :autoload
  include ActiveSupport::Autoload
end  

module A
    autoload :B
end  

#24 楼 @jjym 这个太狠了。

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