Ruby:如何从宏调用宏?

hl0ma9xz  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(108)

我想要一个调用另外两个宏调用的宏。例如,在一个示例中,

之前:

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

之后:

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

我的问题实际上是,如何实现#validates_attr,它除了进行两个单独的宏调用之外没有其他工作。
我一直在阅读宏,看到define_method等。但是,如果我只是委托给另外两个现有的宏,我真的需要为此编写一个新的宏吗?我尝试过写一个类方法,但没有让它工作。

5tmbdcev

5tmbdcev1#

您可以在ValidatedObject::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
mw3dktmi

mw3dktmi2#

创建一个类方法,从这个方法中调用你需要的任何方法。举例来说:

module ValidatedObject
  class Base
    def self.validates name, type:
      puts "will validate #{name} for #{self}"
    end
  end
end

module Attributes
  def attribute name, type: nil
    attr_accessor name
    validates(name, type:) if type
  end
end
  
class Apple < ValidatedObject::Base
  extend Attributes

  attribute :diameter, type: Float # validated attribute
  attribute :color                 # just attribute
end

相关问题