【问题标题】:Executing a mixin method at the end of a class definition在类定义结束时执行 mixin 方法
【发布时间】:2011-03-11 16:03:57
【问题描述】:

我有一个混入,它反映在接收器类上以生成一些代码。这意味着我需要在类定义的末尾执行类方法,就像在这个简单的例子中一样:

module PrintMethods
  module ClassMethods
    def print_methods
      puts instance_methods
    end
  end

  def self.included(receiver)
    receiver.extend ClassMethods
  end
end

class Tester
  include PrintMethods

  def method_that_needs_to_print
  end

  print_methods
end

我想让 mixin 自动为我做这件事,但我想不出办法。我的第一个想法是在 mixin 中将 receiver.print_methods 添加到 self.included 中,但这不起作用,因为我希望它反映的方法尚未声明。我可以在课程结束时打电话给include PrintMethods,但这感觉很糟糕。

是否有任何技巧可以做到这一点,所以我不需要在类定义的末尾调用print_methods

【问题讨论】:

    标签: ruby ironruby mixins


    【解决方案1】:

    首先,类定义没有结束。请记住,在 Ruby 中,您可以在“初始化”后重新打开 Tester 类方法,因此解释器无法知道类“结束”的位置。

    我能想出的解决方案是通过一些辅助方法来创建类,比如

    module PrintMethods
      module ClassMethods
        def print_methods
          puts instance_methods
        end
      end
    
      def self.included(receiver)
        receiver.extend ClassMethods
      end
    end
    
    class Object
      def create_class_and_print(&block)
        klass = Class.new(&block)
        klass.send :include, PrintMethods
        klass.print_methods
        klass
      end
    end
    
    Tester = create_class_and_print do
      def method_that_needs_to_print
      end
    end
    

    但是必须以这种方式定义类肯定会让我的眼睛受伤。

    【讨论】:

    • 哎哟。是的,那很痛。每次创建实例时都会发生 print_methods。最终,它只需要完成一次,或者在修改类时完成。就此而言,我可以在类上添加一个初始化实例方法......我想我只需要在类的末尾调用该方法。
    • print_methods 在您创建 Tester 实例时不会被调用,只是在您创建类时调用。哦,关于那件事,我不知道为什么我首先在​​ Object 类中定义了 create_class_and_print,你可以在模块中定义它,或者在 Object 之外的其他地方。
    • 好的,我明白了。是的,我认为这可能是做我想做的事情的最佳方式......但我可能只需要调用它并完成它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2015-10-20
    • 2012-03-13
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多