0

我有这个:

module CommonMethods  

  def createLog()  
     $log = Logger.new(logPath)  
     puts "Doesn't seem to fire..."  
     $log.level=Logger::INFO  
     return $log  
  end  

在 shared.rb 中。

我试图从另一个脚本中调用它,但最终需要从多个脚本中调用它,如下所示:

require_relative "shared"
include CommonMethods
CommonMethods.createLog

但是,它似乎并没有真正做任何事情。

我尝试创建$log为局部变量和全局变量,但没有“返回”它。我尝试了我能想到的一切(我来自 C# 背景),但我做错了。

在这个例子中,我试图调用一个外部方法来创建“日志”,然后我可以在本地使用它。我将对许多其他方法做同样的事情,但直到我可以正确调用方法。

有人可以帮忙吗?

4

3 回答 3

1

模块是为组织方法而构建的,很高兴被包含在内。如果包含模块,则不再需要命名空间。

require_relative "shared"
include CommonMethods
createLog # Call it simply
于 2013-08-21T16:14:19.270 回答
0

Ruby 模块必须包含在类中。请参阅Module 的文档

你最可能想要的是一门课。

common_methods.rb:

class CommonMethods  
  def self.createLog()  
     $log = Logger.new(logPath)  
     puts "Doesn't seem to fire..."  
     $log.level=Logger::INFO  
     return $log  
  end  
end

在其他文件中:

require 'common_methods'
CommonMethods.createLog
于 2013-08-21T15:34:36.860 回答
0

这里的问题是你试图调用createLog它是一个类方法,而实际上它不是。如果你想调用CommonMethods.createLog,你必须createLog通过像这样定义它来创建一个类方法:

module CommonMethods
  def self.createLog() # Note that it's self.createLog
    $log = Logger.new(logPath)
    puts "Doesn't seem to fire..."
    $log.level=Logger::INFO
    return $log
  end
end

然后你这样称呼它:

require 'common_methods'
CommonMethods.createLog

但是,如果您想include将模块放在一个类中(这是通常使用的模块),您必须将 createLog 保留为“实例方法”,然后包含该模块。

module CommonMethods
  def createLog()
    $log = Logger.new(logPath)
    puts "Doesn't seem to fire..."
    $log.level=Logger::INFO
    return $log
  end
end

然后你像这样使用它:

require 'common_methods'

class SomeOtherClass
  include CommonMethods # Include methods from CommonMethods
end

foo = SomeOtherClass.new
foo.createLog # createLog is an instance method on 'foo' now
于 2013-08-23T13:59:31.687 回答