在Ruby中,我发现为了名称空间,将类放在模块中是很有用的.我还发现可以在类中放置模块.但我不明白你为什么这么做.

模块通常被混合到类中,对吗?那么,what would be the purpose of defining a module inside a class?

推荐答案

我们可以在编写类人猿代码时使用它:

class DrugDealer
  module Drug
    def happy?; true; end
  end

  def approach(victim)
    victim.extend Drug
  end
end

o = Object.new
DrugDealer.new.approach(o)
o.happy? # => true

在现实世界中更实际的另一个例子是,只有子类才能应用mixin.

当一个事物的大约facets个方面应用于某些子类,而其他方面应用于其他子类,而这些方面的应用方式没有足够的顺序来为清晰的类层次 struct (树)让路时,这很有用.想想多重继承吧!一个简单的例子:

class Person
  def handshake
    :sloppy
  end

  def mind_contents
    :spam
  end

  module Proper
    def handshake
      :firm
    end
  end

  module Clever
    def mind_contents
      :theories
    end
  end
end

class Professor < Person
  include Proper
  include Clever

  # ...
end

等等当使用得当时,感觉不错.即使是超级调用和构造函数(我在这里没有定义任何构造函数)也会以我希望的方式在所有的mixin和类中流动.

Ruby相关问答推荐

ruby 中嵌套哈希中相同键的平均值

如何修复 '535-5.7.8 用户名和密码未被接受.在 Devise 邮件确认错误中了解更多信息?

当一个方法在没有参数的 return 关键字上提前退出时,返回什么值?

冒号:和粗箭头=>有什么区别

我如何判断哪些模块已混合到一个类中?

什么是 '?-mix' 在 Ruby 正则表达式中

如何在新行之间拆分字符串并保留空白行?

如何在不将换行符粘贴到字符串中的情况下使用puts添加额外的换行符?

将ruby数组转换为连续对数组

Ruby - net/http - 重定向

如何通过反射获取 Ruby 的 Module 类定义的常量?

为什么整数除法在许多脚本语言中舍入?

如何在 Ruby 中创建可重用的块/proc/lambda?

错误:Windows 的 SASS 安装

rbenv、rvm 和 chruby 有什么区别?

Ruby 1.9 哈希,键中有破折号

如何使用密码保护我的 /sidekiq 路由(即需要对 Sidekiq::Web 工具进行身份验证)?

为什么在 ruby​​ 中动态创建大量符号不是一个好主意(对于 2.2 之前的版本)?

Array.empty 的相反方法是什么?或 [].empty?在Ruby中

如何计算 Ruby 数组中的重复元素