这是我的项目树
main.rb的:
module SomeModule
def some_func p1,p2
puts p1,p2
end
end
some_module.rb
import tensorflow as tf
import sys
# Where to find data
tf.app.flags.DEFINE_string('f1', '', 'feature 1')
tf.app.flags.DEFINE_string('f2', '', 'feature 2')
FLAGS = tf.app.flags.FLAGS
class Test(object):
def __init__(self):
pass
def main(self, args):
flags = getattr(FLAGS,"__flags")
print([(k,v) for (k,v) in flags.iteritems()])
def main(args):
test = Test()
test.main(args)
if __name__ == '__main__':
tf.app.run(main)
但是当我运行main.rb.
ruby给了我一个NoMethodError,为什么?
答案 0 :(得分:2)
您尝试在基本模块上调用该方法,这就是您收到错误的原因。如果您将此模块包含在类中,则此方法仅可用作实例方法。由于您无法定义模块的实例,因此您需要像这样定义它,并且可以直接在模块上调用它。
module SomeModule
def self.some_func p1,p2
puts p1,p2
end
end
但是,如果你想让它成为一个实例方法,你可以这样做:
#main.rb
$LOAD_PATH<<'./lib'
require 'some_module'
class Foo
include SomeModule
end
@foo = Foo.new
@foo.some_func 'p1', 'p2'
#lib/some_module.rb
module SomeModule
def some_func p1,p2
puts p1,p2
end
end
答案 1 :(得分:1)
您将some_func
定义为SomeModule
的实例方法:
module SomeModule def some_func p1,p2 puts p1,p2 end end
但是你在SomeModule
上调用它。由于SomeModule
不是SomeModule
的实例(它是Module
的实例),因此您获得了NoMethodError
:
SomeModule::some_func 'p1', 'p2'
因此,您需要构建SomeModule
:
(foo = Object.new).extend(SomeModule)
foo.some_func(:p1, :p2)
或者您需要确保在某处定义some_func
SomeModule
是一个实例,例如SomeModule
的单例类(Ruby中的每个对象都是它的单例类,实际上是唯一的实例):
module SomeModule
def self.some_func(p1, p2)
puts p1, p2
end
end