【问题标题】:Using define_method inside a Module that gets included inside a Class?在包含在类中的模块中使用define_method?
【发布时间】:2011-11-03 20:29:31
【问题描述】:

我得到了这样的东西:

module MyModule
    define_method(:foo){ puts "yeah!" }
end

class User
  include MyModule
end

但这并没有按预期工作......它们没有定义。 我还需要使用模块,因为我想将那里的方法与普通的用户方法区分开来。我喜欢这样:

MyModule.instance_methods

请帮忙..我错过了什么? 我也试过了:

module MyModule
  (class << self; self; end).class_eval do
    define_method(:foo){ puts "yeah!" }
  end
end

这也不起作用:/

澄清......我想使用:

User.first.foo

不是

MyModule.foo

【问题讨论】:

  • 我觉得还可以:module MyModule; end=&gt; nilclass User; include MyModule; end=&gt; Usermodule MyModule; define_method(:foo){ puts "yeah!" }; end=&gt; #&lt;Proc:0x0000000101fd83e0@(irb):3&gt;User.new.fooyeah!=&gt; nil@9876

标签: ruby-on-rails ruby module metaprogramming


【解决方案1】:

您始终可以使用extend self 技巧:

module MyModule
  define_method(:foo){ puts "yeah!" }

  extend self
end

这使得这个模块既是一个mixin又是一个singleton。

【讨论】:

    【解决方案2】:

    如果你想有一个类方法,以下将起作用

    module MyModule
        define_singleton_method(:foo){ puts "yeah!" }
    end
    
    MyModule.foo
    # >> yeah!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2012-02-19
      • 2013-08-22
      • 1970-01-01
      • 2012-03-26
      • 2021-05-07
      • 2021-12-25
      相关资源
      最近更新 更多