Используя define_method внутри модуля, который включается в класс? - PullRequest
7 голосов
/ 25 августа 2011

Я получил что-то вроде этого:

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

Ответы [ 2 ]

8 голосов
/ 25 августа 2011

Вы всегда можете использовать трюк extend self:

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

  extend self
end

Это делает этот модуль одновременно миксином и синглтоном.

8 голосов
/ 25 августа 2011

Если вы хотите иметь метод класса, будет работать следующее

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

MyModule.foo
# >> yeah!
...