IRB会话中的module_function?

时间:2013-03-30 17:45:08

标签: ruby metaprogramming irb

我有些麻烦要理解为什么Module#module_function在以下irb会话中丢失了?

> class << self      # open singleton for the session's object instance
>   p is_a? Module   # true
>   p respond_to? :module_function   # false ??
> end

我想要实现的目标是什么?在irb会话中直接使用外部模块,即。没有将其包装在新模块中。外部模块使用module_eval动态创建方法,然后在新方法名称上调用module_function。

> require 'dlx/normalize'  # true
> class << self
>   extend DLX::Normalize   # main
>   generic_bind 'laplace-inverse'  # calling DLX::Normalize.generic_bind
> end
NoMethodError: undefined method `module_function' for #<Class:#<Object:0x0000000092e6e0>>

我在这里缺少什么?是否以class << selfsingleton_class.module_exec正确方式访问irb中的最外层模块类?即使 类是<{1}}的后代,为什么module_function也会丢失?

更新 为了使我的问题更加明确,将上述代码包装在新模块定义中确实有效。我不明白为什么需要这种包装。

Module

1 个答案:

答案 0 :(得分:0)

Module.new.respond_to? :module_function
=> false

另外

module Foo
  p respond_to? :module_function
end
=> false

所以,在我期望的任何后代中,你都会得到同样的答案。