在ruby中定义的类之后定义类的实例方法

时间:2013-05-10 12:30:40

标签: ruby metaprogramming class-eval

在将单独的模块包含到单独的类

中之后,我使用实例方法扩展类有一些问题
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

现在我想把这个方法称为:

thread = Thread.new
thread.commentable

问题是,当然是没有与类eval的include方法绑定,我可以保存我想在ActsAsCommentable模块中传递给类eval的变量,但我不想这样做。还有更好的方法吗?

我试图改为

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

但正如我猜测这会为类的单一对象创建实例方法,因此我只能通过

调用它
Thread.commentable

再一次,没有约束力......

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要能够访问commentable扩展程序中的Thread变量,对吗?

如果是这样,只需更改:

Thread.class_eval do

对此:

Thread.class_exec(commentable) do |commentable|

它应该有用。