一次定义类和实例方法-Ruby

jua*_*tas 1 ruby

我想要:

module MyLog

  def log
    unless @log
      @log = Logger.new(log_path)
      @log.formatter =  proc do |severity, datetime, progname, msg|
        "#{datetime} #{msg}\n"
      end
    end
    @log
  end

end
Run Code Online (Sandbox Code Playgroud)

要在其他类之间重用,如下所示:

Class A
  def self.log_path; 'log/a.log' end
  def log_path; 'log/a.log' end
  include MyLog
  extend  MyLog

  def some_method
    log.debug 'some thing'
  end

  def self.some_class_method
    log.debug 'in a class method'
  end

end
Run Code Online (Sandbox Code Playgroud)

是否比A类开始时的那四行短?

另一件事

我想分批记录:

def expire
  expired_ids = []
  failed_ids  = []

  all.each do |event|
    if event.expire # saves record
      expired_ids << event.id
    else
      failed_ids << event.id
    end
  end

  log.debug "These ids were expired: #{ expired_ids }"
  log.debug "These ids failed to expire: #{ failed_ids }"
end
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以干净地做到这一点?将日志记录与方法逻辑分开?

Bor*_*cky 5

这是我最近遇到类似您的问题时一直在做的事情:

class A
  class << self
    include MyLog

    def log_path
      'log/a.log'
    end
  end

  delegate :log_path, :log, to: "self.class"
end
Run Code Online (Sandbox Code Playgroud)

否则,选择最佳的编程方法取决于您的情况,重用脚本的频率,在脚本的生命周期中必须重构脚本的次数等等。但是无论如何,请不要试图保存代码,而是在下次自己阅读代码时尝试避免麻烦。

关于第二个问题,您面临的主要难题是,是否值得引入“事件”类:

class Events < Array
  def foobar
    each_with_object [[], []] do |event, (expired_ids, failed_ids)| 
      ( event.expire ? expired_ids : failed_ids ) << event.id
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,当时间到了:

def expire
  expired_ids, failed_ids = Events[ all ].foobar
  log.debug "These ids were expired: #{ expired_ids }"
  log.debug "These ids failed to expire: #{ failed_ids }"
end
Run Code Online (Sandbox Code Playgroud)