Techioz Blog

Ruby: マクロからマクロを呼び出すにはどうすればよいですか?

概要

他の 2 つのマクロ呼び出しを呼び出すマクロが必要です。例えば。、

前に:

  class Apple < ValidatedObject::Base
    attr_accessor :diameter
    validates :diameter, type: Float
  end

後:

  class Apple < ValidatedObject::Base
    validates_attr :diameter, type: Float
  end

私の質問は実際のところ、#validates_attr を実装する方法です。#validates_attr には 2 つの別々のマクロ呼び出しを行う以外の仕事はありません。

マクロについて読んだり、define_method などを調べたりしています。しかし、他の 2 つの既存のマクロに委任するだけの場合、本当にそのための新しいマクロを作成する必要がありますか?クラスメソッドを書いてみましたが、うまくいきませんでした。

解決策

次のように、Validated Object::Base クラスでメソッドを定義できます。

class ValidatedObject::Base
  def self.validates_attr(name, type:)
    attr_accessor name
    validates name, type: type
  end

  #...
end

そして、次のように Apple サブクラスからそのメソッドを呼び出します。

class Apple < ValidatedObject::Base
  validates_attr :diameter, type: Float
end