我在理解爲什麼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 << self
或singleton_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
請問您能否更明確地表達您的疑惑? –
外部模塊使用'Module#module_function'。模塊的方法在IRB中添加'extend'後,調用將失敗,並且* NoMethodError *其中'module_function'方法不應該丟失。這是「模塊」定義的標準部分。 –