2013-03-30 18 views
0

我在理解爲什麼Module#module_function在以下irb會話中缺少一些麻煩?IRB會話中的module_function?

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

我在這裏錯過了什麼?正在訪問最外層的 irb中的模塊類與class << selfsingleton_class.module_exec正確的方法?爲什麼module_function丟失,即使類的後裔Module

更新: 爲了讓我的問題更加明確,將上述代碼封裝到新的模塊定義中的確行得通。我不明白爲什麼這個包裹需要。

> require 'dlx/normalize' # true 
> module Dummy 
> extend DLX::Normalize # main 
> generic_bind 'laplace-inverse' # calling DLX::Normalize.generic_bind 
>         # this method calls module_function 
> end 
> Dummy.generated_laplace(1.234) # got new module's method 
>         # previous call to module_function 
>         # did succeeded 
+0

請問您能否更明確地表達您的疑惑? –

+0

外部模塊使用'Module#module_function'。模塊的方法在IRB中添加'extend'後,調用將失敗,並且* NoMethodError *其中'module_function'方法不應該丟失。這是「模塊」定義的標準部分。 –

回答

0
Module.new.respond_to? :module_function 
=> false 

而且

module Foo 
    p respond_to? :module_function 
end 
=> false 

所以你會得到我期望的任何後代相同的答案。

+0

這很奇怪。 '''模塊Foo; p respond_to? :module_function#false; def測試; 42;結束 ; module_function:test;包含Foo;包含Foo;測試#42'''所以它看起來像'''module_function'' *不是* Module類的一個方法。那麼那是什麼? –