ruby-on-rails – 了解“后续”mixin模块的`include`语句行为

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 了解“后续”mixin模块的`include`语句行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图理解在多个Mixins中使用时的include语句行为.也就是说,我有这些陈述:
  1. class Article < ActiveRecord::Base
  2. include DoubleIncludedModule
  3. include AModule
  4.  
  5. # ...
  6. end
  7.  
  8. module AModule
  9. include DoubleIncludedModule
  10.  
  11. # ...
  12. end
  13.  
  14. module DoubleIncludedModule
  15. # ...
  16. end

Article类中包含DoubleIncludedModule的次数是多少?也就是说,由于DoubleIncludedModule的“后续”包含(第一个在Article类中,然后在Article类本身包含的AModule中),将是Ruby自动处理的“双重包含”问题,或者包含DoubleIncludedModule(错误地)两次?

当然,我想只包含一次DoubleIncludedModule模块.我怎样才能以正确的方式实现(可能通过使用一些Ruby on Rails方法)?

解决方法

我将以一个例子回答:
  1. module M
  2. def self.included base
  3. puts "M included in #{base}"
  4. end
  5. end
  6.  
  7. module N
  8. include M
  9.  
  10. def self.included base
  11. puts "N included in #{base}"
  12. end
  13. end
  14.  
  15. class C
  16. include M
  17. include N
  18. end
  19.  
  20. p C.ancestors

版画

  1. M included in N
  2. M included in C
  3. N included in C
  4. [C,N,M,Object,Kernel,BasicObject]

正如我们所看到的,M只被包含在C中一次.虽然从技术上来说它被包括两次,因为它被包含在N中,它也包含在C中.这有关系吗?可能不是.每个仍然只在祖先链中出现一次,并且任何方法都会被等同的实现覆盖 – 即,基本上是无操作.除非你用包括钩子做一些异国情调,否则你不太可能注意到任何东西.

猜你在找的Ruby相关文章