为什么ruby模块给了我NoMethod错误?

时间:2018-04-01 05:38:04

标签: ruby module

这是我的项目树

  • 项目
    • main.rb的
    • LIB
      • some_module.rb

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,为什么?

2 个答案:

答案 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