Получилось примерно так:

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
7
nex 25 Авг 2011 в 20:09

2 ответа

Лучший ответ

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

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

  extend self
end

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

8
tadman 25 Авг 2011 в 16:29

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

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

MyModule.foo
# >> yeah!
8
James Kyburz 25 Авг 2011 в 16:18