Ruby混合属性

Ruby混合属性,ruby,properties,mixins,Ruby,Properties,Mixins,受datamapper如何使用mixin的启发,我需要了解如何使用mixin复制以下内容 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 It

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

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

非常感谢您的帮助。谢谢。

默认情况下,如果
在另一个类中包含属性
,则其他类的实例可以使用所有实例方法作为实例方法

在本例中,您可以在另一个类中使用
扩展属性
,这样
属性
的实例方法就变成了另一个类的类方法

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属性
,则可以钩住模块的
include
方法,并在其中添加必要的方法

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

默认情况下,如果在另一个类中
包含属性
,则其他类的实例可以使用所有实例方法作为实例方法

在本例中,您可以在另一个类中使用
扩展属性
,这样
属性
的实例方法就变成了另一个类的类方法

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属性
,则可以钩住模块的
include
方法,并在其中添加必要的方法

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

所以在关注了Arie的帖子之后,我就是这么做的

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

所以在关注了Arie的帖子之后,我就是这么做的

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

你好,阿里,谢谢你的详细解释。@GavinYap没问题:)你好,阿里,谢谢你的详细解释。@GavinYap没问题:)