Ruby 混合 属性

Ruby Mixins Property

受到 datamapper 如何使用 mixins 的启发,我需要了解如何使用 mixins 复制以下内容

module Property
  def property(name, type, value)
    #Some code
  end
end

class Weapon 
  include Property

  property :name, :string, "The legendary Sword"
  property :attack, :integer, 10
end

class Item
  include Property

  property :name, :string, "Magic Carpet"
  property :description, :string, "Fly you to the moon"
end

但是我有一个错误,

NoMethodError: undefined method `property' for Route:Class

非常感谢任何帮助。谢谢

默认情况下,如果您 include Property 在另一个 class 中,所有实例方法都可以作为实例方法供其他 class 的实例使用。

在你的例子中,你可以在另一个 class 中使用 extend Property,所以 Property 的实例方法变成了另一个 class 的 class 方法].

module Property
  def property(name, type, value)
    #Some code
  end
end

class Weapon 
  extend Property

  property :name, :string, "The legendary Sword"
  property :attack, :integer, 10
end

或者如果您更喜欢使用 include Property,您可以挂钩模块的 included 方法,并在那里添加必要的方法。

module Property
  def self.included(clazz)
    clazz.define_singleton_method(:property) do |name, type, value|
      p [name, type, value]
    end
  end
end

所以在跟随 Arie 的 post 之后,这就是我所做的

module Item
  def self.included(item)
    item.extend Property
  end         
end

module Property
def property(name, type, value)
  define_method(name) { p [name, type, value] }
end

class Weapon 
  include Item

  property :name, :string, "The legendary Sword"
  property :attack, :integer, 10
end