2013-05-10 1 views
0

У меня есть некоторые проблемы с расширением класса с методом экземпляра после отдельного модуля входят в отдельный классОпределить метод экземпляра класса после класса, уже определенного в рубина

module ActsAsCommentable 
    def self.included(commentable) 
    Thread.class_eval do 
     def commentable 
     p "disqusable is #{commentable}" 
     p "disqusable class is #{commentable}" 
     end 
    end 
    end 
end 


class Thread 
    #some code... 
end 

class Asset 
    include ActsAsCommentable 
end 

А теперь я хочу, чтобы вызвать этот метод somelike это :

thread = Thread.new 
thread.commentable 

проблема заключается в том, конечно, что нет привязки с включают метод класса Eval, и я мог бы сохранить переменные, которые я хочу передать в класс Eval в ActsAsCommentable модуле, но я не хочу. Есть ли способ лучше?

Я пытался сделать вместо

module ActsAsCommentable 
    def self.included(commentable) 
    class << Thread 
     define_method :commentable do 
     p "disqusable is #{commentable}" 
     p "disqusable class is #{commentable}" 
     end 
    end 
    end 
end 

Но, как я догадался, это создает метод экземпляра для singletone объекта класса, и поэтому я могу назвать это только через

Thread.commentable 

И опять же, не обязательными. ..

+1

Комментарии [Threads] (http://ruby-doc.org/core-2.0/Thread.html)? Что это за безумие? Возможно, вам нужно выбрать более конкретное имя, которое не противоречит механизму параллелизма. –

+0

хорошо это работает с модулями disqus, и есть объект Thread, и поэтому вопрос не в этом). В коде этот модуль вложен в Disqus :: Thread, я просто не хотел бы загрязнять пример. Но вы правы в целом. – sandric

+1

Я знаю, что вопрос не в этом, это именно то, о чем я думал при чтении кода :) –

ответ

0

Если я вас правильно понимаю, вам нужно иметь доступ к переменной commentable внутри вашего расширения Thread, верно?

Если да, то просто изменить:

Thread.class_eval do 

к этому:

Thread.class_exec(commentable) do |commentable| 

И он должен работать.

+0

Ну, на самом деле, не совсем - мой вопрос был о создании нового метода внутри класса Thread и доступа к нему в комментариях - мне пришлось использовать define метод внутри класса_exec - потому что в определении def my_new_method происходит изменение contenxt. Но это было полезно с class_exec, спасибо – sandric

+0

@sandric: Рад помочь как-нибудь. – Linuxios