【问题标题】:How can I run a method at the end of a file from a gem?如何在 gem 的文件末尾运行方法?
【发布时间】:2016-10-04 18:09:51
【问题描述】:

我有一个 gem(例如mygem),通常情况下,我通过将require "mygem" 放在顶部来将mygem 添加到文件中。如果我在mygem 中有一个名为finish_jobs 的方法,我希望它在以下位置运行:

require "mygem"
# code, code code
finish_jobs

如果不强制用户在每次使用 gem 时添加方法,我该怎么做?

具体来说,我要做的是编写一个服务器应用程序(带机架),我需要在服务器启动之前处理文件正文中的方法。

【问题讨论】:

  • “代码代码代码”是您启动服务器的位置吗?
  • code code code 如果我正在设置服务器的各个部分,必须在开始运行之前设置这些部分。
  • 我觉得您应该编写一个 config.rb 来满足您的需求并对其进行重构。
  • 在退出时任意运行这样的代码对于 gem 来说是非常粗鲁的除非你有一个非常具体的用例并且你的库的用户完全期待它。我能想到的一个例子是test/unit,它默认运行测试只需要库。
  • @thesecretmaster 你如何启动服务器?也许您可以在您的 gem 中添加一个自动应用的机架中间件?

标签: ruby rubygems require rack


【解决方案1】:

这当然是可能的。

为什么不直接将代码添加到 Gem 中(因为它听起来像是在您的控制之下,而不是外部依赖项)?

module MyGem
  def printSomething
    p 2 + 2
  end

  module_function :printSomething
  printSomething()
  # => 4
end

如果这不是您的想法,请告诉我,我可以更新解决方案。

另外,请参阅Kernel#at_exit
关于Kernel#at_exit的更多解释性指南

【讨论】:

  • 另一种可能性是检查来自main 的返回值或任何全局对象(编写代码的位置) - 但请注意,它的名称会根据运行位置而改变(irb等)
【解决方案2】:

我不知道如何做你所描述的事情。

一种解决方法是提供一个接受块的 API。这种方法允许您在用户设置之后运行代码,而无需向他们公开实现细节。

用户可以调用你的库方法,提供一个块来设置他们的服务器:

require "mygem" 

MyGem.code_code_code {
  # user's code goes here
} 

然后,您的库代码将:

  • 接受阻止
  • 调用一些库代码

这是一个示例实现:

module MyGem  
  # Run some user-provided code by `yield`-ing the block 
  # Then run the gem's finalizer 
  def self.code_code_code
    # Execute the block: 
    yield 
    # Finalize:
    finish_jobs
  end 
end 

这样,您可以接受来自用户的代码,但仍可以控制设置和完成。

希望对你有帮助!

【讨论】:

  • 如果我有多个块方法,是否有办法做到这一点,然后在执行代码之后运行我的函数?
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2012-08-31
  • 2012-05-16
  • 2022-08-17
  • 1970-01-01
相关资源
最近更新 更多