【问题标题】:What is the opposite of Ruby's include?Ruby 包含的反义词是什么?
【发布时间】:2010-01-18 18:22:10
【问题描述】:

如果我有一个包含多个包含模块的类实例,我可以动态取消包含特定模块(以替换它)吗?

谢谢。

【问题讨论】:

    标签: ruby reflection


    【解决方案1】:

    没有。您不能在 Ruby 语言 中取消包含 mixin。不过,在某些 Ruby 实现上,您可以通过用 C 或 Java(甚至是 Rubinius 的情况下的 Ruby)编写特定于实现的扩展来做到这一点。

    【讨论】:

      【解决方案2】:

      真的不是一回事,但你可以用这样的东西来伪造它:

      module A
        def hello
          puts "hi!"
        end
      end
      
      class B 
        include A
      end
      
      class C
        include A
      end
      
      B.new.hello # prints "Hi!"
      
      class Module
        def uninclude(mod)
          mod.instance_methods.each do |method|
            undef_method(method)
          end
        end
      end
      
      class B
        uninclude A
      end
      
      B.new.hello rescue puts "Undefined!" # prints "Undefined!"
      C.new.hello  # prints "Hi!"
      

      这可能适用于常见情况,但它可能会在更复杂的情况下给您带来麻烦,例如模块将自身插入继承链的位置,或者您有其他模块提供命名相同的方法,您仍然希望能够打电话。您还需要手动反转 Module.included?(klass) 所做的任何事情。

      【讨论】:

        【解决方案3】:

        试试http://github.com/yrashk/rbmodexcl,它为你提供了unextend方法。

        【讨论】:

          【解决方案4】:

          使用 Mixology C 扩展(用于 MRI 和 YARV):http://www.somethingnimble.com/bliki/mixology

          【讨论】:

            【解决方案5】:

            如果你已经 include-ed 了一些东西,你可以使用 load 重新包含文件。 load-ed 文件中的任何定义都将覆盖现有方法。

            【讨论】:

              【解决方案6】:

              真正的答案是细化

              请检查这个答案。

              https://stackoverflow.com/a/19462745/1409600

              【讨论】:

                猜你喜欢
                • 2010-09-23
                • 1970-01-01
                • 2012-05-08
                • 2016-11-25
                • 2011-01-04
                • 2014-04-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多