我正在试图弄清楚如何做这个最简单的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
答案 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