不了解如何通过模块动态地向Ruby类添加功能

时间:2013-05-11 17:32:15

标签: ruby

我正在试图弄清楚如何做这个最简单的Ruby元编程事情并且无法让它工作。我想要一个名为Logger的模块,如果类扩展/包含它,它可以调用x_mod,然后允许在该类的实例上使用方法日志等功能。这纯粹是为了学习,而不是对项目中的代码有意义。这是

module Logger
  def x_mod
    def self.log
      puts "I want to log here #{inspect}"
    end
  end

  #def say_hello
  #  puts "saying hello"
  #end
end

class Jt
  #include Logger
  #include MyModule
  extend Logger
  x_mod
end

并获得以下内容:

1.9.3-p392 :004 > require './jt'
 => false 
1.9.3-p392 :005 > j=Jt.new
 => #<Jt:0x007fecf48fafa0> 
1.9.3-p392 :006 > j.log
NoMethodError: undefined method `log' for #<Jt:0x007fecf48fafa0>
    from (irb):6
    from /Users/jt/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'
1.9.3-p392 :007 >

有关下一步的任何想法? THX

2 个答案:

答案 0 :(得分:3)

module Logger
  def x_mod
    define_method(:log) do
      puts "I want to log here #{inspect}"
    end
  end
end

class Jt
  extend Logger
  x_mod # comment me out to make log fail later
end

j = Jt.new
j.log

答案 1 :(得分:-1)

哎呀,抱歉以前的回答,没看到Logger作为一个模块。看看这个:http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/你要使用include而不是extend。

这段代码很好用:

module Logger
  def x_mod
    def self.log
      puts "I want to log here #{inspect}"
    end
  end

  #def say_hello
  #  puts "saying hello"
  #end
end

class Jt
  include Logger
end

jtlog = Jt.new
Jt.log