在定义类时调用一次ruby方法

时间:2018-02-19 22:11:59

标签: ruby class

假设我有多个继承自公共父级的子类。

我想使用define_method以编程方式为每个子节点定义一些方法。但是,为每个孩子定义的方法列表是不同的

所以我实现了以下内容 -

class Parent
  def define_some_methods!
    self.class::MY_METHODS.each do |m|
      proc = Proc.new { "You called method #{m}" }
      self.class.send(:define_method, m, &proc)
    end
  end
end

class ChildOne < Parent
  MY_METHODS = [:foo, :bar]

  def initialize
    define_some_methods!
  end
end

class ChildTwo < Parent
  MY_METHODS = [:alpha, :bravo]

  def initialize
    define_some_methods!
  end
end

ChildOne.new.foo    #=> "You called method foo"
ChildTwo.new.alpha  #=> "You called method alpha"

这很好用,但每次实例化一个新类时都会调用define_some_methods。这种方法在课堂上不断重新定义相同的方法。

在定义初始类时,有没有办法一次

我试过像 -

这样的东西
class ChildTwo < Parent
  MY_METHODS = [:alpha, :bravo]

  define_some_methods!
end

但是错误

NoMethodError: undefined method `define_some_methods!' for ChildTwo:Class
Did you mean?  define_method

2 个答案:

答案 0 :(得分:0)

您确定在这种情况下需要元编程吗?你能在Parent中定义一个方法名称的额外参数吗?

如果Parent可以是一个模块,那么我们可以这样解决:

module Parent
  def self.module(*methods)
    Module.new do |_mod|
      methods.each do |method|
        define_method(method) { "You called method #{method}" }
      end
    end
  end
end

class ChildOne
  include Parent.module(:foo, :bar)
end

class ChildTwo
  include Parent.module(:alpha, :bravo)
end

答案 1 :(得分:0)

您已为父级定义了一个实例方法,但您需要一个类方法,如下所示:

class Parent
  def self.define_some_methods!
    self::MY_METHODS.each do |m|
      proc = Proc.new { "You called method #{m}" }
      send(:define_method, m, &proc)
    end
  end
end