【问题标题】:Ruby module as both namespace and mixinRuby 模块同时作为命名空间和 mixin
【发布时间】:2012-04-06 09:14:31
【问题描述】:

在我目前正在开发的 Rails 应用程序中,我有许多“请求”模型。我们正在使用很多 Web 服务,并且我们对这些服务有很多不同的请求,每个请求都有自己的逻辑(主要是验证)。所以它们都被分组在一个模块中作为命名空间:

module Request
end

所以现在每个请求都是这样的:

class Request::SendSomeData
end

到目前为止,一切都很好......问题是我们将有很多这样的请求,它们将共享一些共同的逻辑。包含模块很容易

class Request::SendSomeData
  include Request
end

…(所以它既可以作为命名空间又可以作为 mixin),但我想知道是否有一种方法可以在没有包含的情况下实现它(因为这将是某种代码重复)。

Ruby 有没有办法在不显式包含模块的情况下将一些实例方法放在模块命名空间中的所有类中?

换句话说,我可以有类似的东西:

module Request
  def someMethod
  end
end

class Request::SendSomeData
end

并且能够使用

Request::SendSomeData.new.someMethod

同时?

【问题讨论】:

  • 你考虑过通过子类继承吗?
  • 其实是的。这就像“它不是那么酷”:)。如果没有太多“durty hacking”方式,我更喜欢另一种方式。阅读源代码时,命名空间看起来更易读。

标签: ruby-on-rails ruby


【解决方案1】:

如果没有一些邪恶的黑客,你所要求的就无法完成。

你要么有太多的课程,要么专注于一个太不重要的问题。每个类只有一行代码。

另一种方法是创建一个基本模型类,正如我之前在another question 中描述的那样,但这需要派生类来每次调用set_table_name,所以它不会为您节省任何输入。

【讨论】:

  • 我在想这是一种红宝石方式。由于我已经在命名空间,我在想应该有一种方法可以将功能注入命名空间中的所有类。无论如何,你是完全正确的,专注于不重要的事情:)。谢谢
猜你喜欢
  • 2013-09-06
  • 2020-07-14
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2017-07-23
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多